- ベストアンサー
reallocでエラーが発生してしまう問題について
- reallocを使うとエラーが発生し、プログラムが実行できません。
- 試したプログラムでは、glibc detectedエラーが表示されました。
- 他の環境でのコンパイルでは正常に実行できたため、glibcに問題がある可能性があります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
次のプログラムの結果はどうなりますか? #include <stdio.h> int main() { static const char msg[] = "これは16文字です"; printf("%zu\n", sizeof msg); return 0; }
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
日本語で使う文字だと, ・shift_jis では 2バイト/文字 (今さら使わないと思うけど, いわゆる半角カナは 1バイト/文字) ・utf-8 では 3~4バイト/文字 (2バイトの範囲には, 「普通使いそうな文字」はなかったと思う: 表を見ないと正確なことはわかりませんが) でしょう. 多分. ところで, もとの malloc で「十分」確保した場合には動きますか? ひょっとしたら表示のところが変になるかもしれませんよ.
お礼
遅くなってすみません。 malloccで十分に確保した場合(今回は100)も正常に動作しました。 表示もふつうに「これは16文字です.」と出ました。 いろいろとありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
#1 です. あ~やっぱりね~. そんなところだと思ったんだ~. その環境では "これは16文字です" という文字列は (最後の '\0' を含めて) 24バイトだから, 少なくとも 24バイト確保しておかないとうまく動かない (かもしれない) です. 文字コードは UTF-8 かなぁ? ちなみに「そんな風に思った」根拠は, glibc のメッセージにあります. これ, (とてつもなく) 意訳すると「realloc しようとしたけど, メモリを管理するための領域がぶっ壊れていて無理だから死にます」って意味です. となれば, 怪しいのは「realloc するための管理領域をいじることのできる場所」で, それは malloc したあとの strcpy 以外にありえません. しかも, これが怪しいと仮定すると「実は文字列の長さが違っている」ことくらいしか考えられないので, #1 に挙げたテストプログラムにいきつきます.
補足
なるほど。 ありがとうございます。 そうなると、文字コードによってサイズが違うということですか? shift-jisは2byte/1文字 utf-8は3byte/1文字 ということでしょうか?
- asuncion
- ベストアンサー率33% (2127/6290)
> printf(p); printf()の第1引数が書式文字列以外である点に、 問題が潜んでいるのではないでしょうか。 上記の文を、 printf("%s\n", p); のように変えてみたとき、実行結果はどうなるでしょうか。
補足
やってみたところ結果はまったく同じでした。
補足
このプログラムを実行したら 24 と表示されました。 ということはmalloc(24)しなければならないということですか?