
reallocを使うとエラーがでます。
簡単なreallocのプログラムでもエラーがでて、realloc自体が使えないような感じです。
どうしたらよいでしょうか?
試したプログラムは
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main(void){
char *p;
p=malloc(17);
if(!p){
printf("error\n");
exit(1);
}
strcpy(p,"これは16文字です");
p=realloc(p,18);
if(!p){
printf("error\n");
exit(1);
}
strcat(p,".");
printf(p);
free(p);
return 0;
}
というもので、
*** glibc detected *** ./test: realloc(): invalid next size: 0x09b61008 ***
======= Backtrace: =========
/lib/libc.so.6[0x43ca2f]
/lib/libc.so.6(realloc+0xfe)[0x43e68e]
/lib/libc.so.6[0x43ea61]
/lib/libc.so.6(realloc+0x3c)[0x43e5cc]
./test[0x8048512]
/lib/libc.so.6(__libc_start_main+0xe0)[0x3e8f70]
./test[0x80483e1]
======= Memory map: ========
00235000-0023f000 r-xp 00000000 fd:00 360450 /lib/libgcc_s-4.1.2-20070626.so.1
0023f000-00240000 rwxp 00009000 fd:00 360450 /lib/libgcc_s-4.1.2-20070626.so.1
003d3000-00521000 r-xp 00000000 fd:00 360473 /lib/libc-2.6.so
00521000-00522000 r-xp 0014e000 fd:00 360473 /lib/libc-2.6.so
00522000-00524000 rwxp 0014f000 fd:00 360473 /lib/libc-2.6.so
00524000-00527000 rwxp 00524000 00:00 0
00616000-00631000 r-xp 00000000 fd:00 360466 /lib/ld-2.6.so
00631000-00632000 r-xp 0001a000 fd:00 360466 /lib/ld-2.6.so
00632000-00633000 rwxp 0001b000 fd:00 360466 /lib/ld-2.6.so
006c0000-006c1000 r-xp 006c0000 00:00 0 [vdso]
08048000-08049000 r-xp 00000000 fd:00 3473718 /home/gucchi/test/test
08049000-0804a000 rw-p 00000000 fd:00 3473718 /home/gucchi/test/test
09b61000-09b82000 rw-p 09b61000 00:00 0
b7e00000-b7e21000 rw-p b7e00000 00:00 0
b7e21000-b7f00000 ---p b7e21000 00:00 0
b7fd6000-b7fd8000 rw-p b7fd6000 00:00 0
bfb07000-bfb1c000 rw-p bfb07000 00:00 0 [stack]
アボートしました
というエラーがでます。
試しに他の環境でコンパイルしたら実行できちゃいました。
glibcに問題があったりするんでしょうか?
ご教授ください。
No.4
- 回答日時:
日本語で使う文字だと,
・shift_jis では 2バイト/文字 (今さら使わないと思うけど, いわゆる半角カナは 1バイト/文字)
・utf-8 では 3~4バイト/文字 (2バイトの範囲には, 「普通使いそうな文字」はなかったと思う: 表を見ないと正確なことはわかりませんが)
でしょう. 多分.
ところで, もとの malloc で「十分」確保した場合には動きますか? ひょっとしたら表示のところが変になるかもしれませんよ.
遅くなってすみません。
malloccで十分に確保した場合(今回は100)も正常に動作しました。
表示もふつうに「これは16文字です.」と出ました。
いろいろとありがとうございます。
No.3
- 回答日時:
#1 です.
あ~やっぱりね~. そんなところだと思ったんだ~.
その環境では "これは16文字です" という文字列は (最後の '\0' を含めて) 24バイトだから, 少なくとも 24バイト確保しておかないとうまく動かない (かもしれない) です. 文字コードは UTF-8 かなぁ?
ちなみに「そんな風に思った」根拠は, glibc のメッセージにあります. これ, (とてつもなく) 意訳すると「realloc しようとしたけど, メモリを管理するための領域がぶっ壊れていて無理だから死にます」って意味です. となれば, 怪しいのは「realloc するための管理領域をいじることのできる場所」で, それは malloc したあとの strcpy 以外にありえません. しかも, これが怪しいと仮定すると「実は文字列の長さが違っている」ことくらいしか考えられないので, #1 に挙げたテストプログラムにいきつきます.
この回答への補足
なるほど。
ありがとうございます。
そうなると、文字コードによってサイズが違うということですか?
shift-jisは2byte/1文字
utf-8は3byte/1文字
ということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- その他(プログラミング・Web制作) python 2 2022/12/23 09:06
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
Opencv画像処理 bmp処理
-
算術型変換について
-
構造体メンバの初期化
-
reallocでエラー
-
C言語プログラムで、ループがう...
-
C言語でのCSVファイルの読み出...
-
char型2つを結合し、short型に...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
「指定されたキャストは有効で...
-
エクセルで可視セルにのみ値貼...
-
数学のデータの相関の散布図で...
-
#if 1 #elseの意味について
-
「Aに対するBの割合」と「Aに対...
-
マイナスからプラスへ転じた時...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
DWORDの実際の型は何でしょうか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
空白を含んだ文字列がうまく格...
-
【C言語】全角文字の配列を、全...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
C言語のプログラムで、途中で止...
-
リストの作成と出力(C言語)
-
char型2つを結合し、short型に...
-
WinInetのInternetOpenUrl関数...
-
大量のファイルを読み込み、そ...
-
c言語で文書を読み込み、単語の...
-
ビルドエラーの対処がわからな...
-
C言語のシリアル通信について
-
プログラミングの授業の課題です
-
Ç言語でファイルサイズを変更す...
-
csvファイルの読み取り
-
[C言語 Windows] Visual Cでの...
-
C++で指定文字列のカウント方法...
-
なぜ無限ループになるかが分か...
おすすめ情報