情報科学屋さんを目指す人のメモ(FC2ブログ版)

何かのやり方や、問題の解決方法をどんどんメモするブログ。そんな大学院生の活動「キャッシュ」に誰かがヒットしてくれることを祈って。

ブログ内検索

スポンサーサイト このエントリーを含むはてなブックマーク

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 | 編集

size_t型をprintfで表示するときは このエントリーを含むはてなブックマーク

sizeだから、unsignedだろう。だから、"%u"で出力できるだろうと思っていたら、32bitから64bitに移植した時にエラーだらけに。

size_t型をprintfやsprintfで表示するときには、"%zd"のように、"z"を使えばいいらしい。知らなかった。

printf("size=%zd\n", sizeof(char *));

ちなみに、uint64_t型を表示するときには、

printf("value64=%"PRIu64"\n", (uint64_t) value64);

のように、PRIu64というマクロを利用します。

うーん、知らないとこれは分かりませんよね。

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
C実践プログラミング
C言語逆引き大全 500の極意

スポンサーサイト
C言語 | コメント:0 | トラックバック:0 | 編集

C言語のfree関数の内部でエラー このエントリーを含むはてなブックマーク

eclipseでC言語のプログラムをデバッグ実行してみるとfree関数の内部でエラーを起こしているようでした。スタックトレースはこんな感じ。

Thread[1](Suspended: Signal 'SIGABRT' received. Description: Aborted.)
14 _kernel_vsyscall() 0xb7f4a410
13 raise() 0xb7e02085
12 abort() 0xb7e03a01
11 0xb733ab7c
10 0xb7e42a85
9 free(9 0xb7e754f0
...

はて、何でだろう。二重にfreeしてるのか?とも思いましたが、そうではなかったみたいです。

問題のコードはだいたいこんな感じ

char *str = (char *) malloc(sizeof(char) * 4; char *str2 = NULL; strcpy(str, "abc"); str2 = str + 2; free(str2);

なんかだいぶ適当な例ですが、ポイントは、mallocから受け取ったアドレス(str)から ずれたアドレス(str2)でフリー使用としているということです。

フリーで渡すべきポインタ型の変数はmallocで確保したメモリ領域の先頭である必要があるので、そのメモリ領域の途中をfree関数に渡してはいけません。っていうことみたいです。

大したことじゃないんですけど、デバッグって大変ですね。っていうことです。

実践 デバッグ技法 ―GDB、DDD、Eclipseによるデバッギング
Debug Hacks -デバッグを極めるテクニック&ツール
C言語 デバッグ完全解説 (Gihyo Technology)

C言語 | コメント:0 | トラックバック:0 | 編集
 | HOME | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。