• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:reallocでエラー)

reallocでエラーが発生してしまう問題について

このQ&Aのポイント
  • reallocを使うとエラーが発生し、プログラムが実行できません。
  • 試したプログラムでは、glibc detectedエラーが表示されました。
  • 他の環境でのコンパイルでは正常に実行できたため、glibcに問題がある可能性があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

次のプログラムの結果はどうなりますか? #include <stdio.h> int main() { static const char msg[] = "これは16文字です"; printf("%zu\n", sizeof msg); return 0; }

gucchi_sk
質問者

補足

このプログラムを実行したら 24 と表示されました。 ということはmalloc(24)しなければならないということですか?

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

日本語で使う文字だと, ・shift_jis では 2バイト/文字 (今さら使わないと思うけど, いわゆる半角カナは 1バイト/文字) ・utf-8 では 3~4バイト/文字 (2バイトの範囲には, 「普通使いそうな文字」はなかったと思う: 表を見ないと正確なことはわかりませんが) でしょう. 多分. ところで, もとの malloc で「十分」確保した場合には動きますか? ひょっとしたら表示のところが変になるかもしれませんよ.

gucchi_sk
質問者

お礼

遅くなってすみません。 malloccで十分に確保した場合(今回は100)も正常に動作しました。 表示もふつうに「これは16文字です.」と出ました。 いろいろとありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

#1 です. あ~やっぱりね~. そんなところだと思ったんだ~. その環境では "これは16文字です" という文字列は (最後の '\0' を含めて) 24バイトだから, 少なくとも 24バイト確保しておかないとうまく動かない (かもしれない) です. 文字コードは UTF-8 かなぁ? ちなみに「そんな風に思った」根拠は, glibc のメッセージにあります. これ, (とてつもなく) 意訳すると「realloc しようとしたけど, メモリを管理するための領域がぶっ壊れていて無理だから死にます」って意味です. となれば, 怪しいのは「realloc するための管理領域をいじることのできる場所」で, それは malloc したあとの strcpy 以外にありえません. しかも, これが怪しいと仮定すると「実は文字列の長さが違っている」ことくらいしか考えられないので, #1 に挙げたテストプログラムにいきつきます.

gucchi_sk
質問者

補足

なるほど。 ありがとうございます。 そうなると、文字コードによってサイズが違うということですか? shift-jisは2byte/1文字 utf-8は3byte/1文字 ということでしょうか?

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.2

> printf(p); printf()の第1引数が書式文字列以外である点に、 問題が潜んでいるのではないでしょうか。 上記の文を、 printf("%s\n", p); のように変えてみたとき、実行結果はどうなるでしょうか。

gucchi_sk
質問者

補足

やってみたところ結果はまったく同じでした。

関連するQ&A