- ベストアンサー
領域の開放がされているかどうかはどうやって調べればいいのでしょう。
#include <stdio.h> #include <stdlib.h> int main(void){ char *str; printf("&str : %d\n", &str); // ●領域割り当て前のアドレス(NULL) printf("str : %d\n", str); str = (char *)calloc(15, sizeof(char)); // (1)領域割り当て後のアドレス printf("str : %d\n", str); // str領域開放 free(str); // (2)領域解放後のアドレス printf("str : %d\n", str); return 1; } 開放した後は●と同じくNULLになると思っていたのですが、 実際に実験してみて(1)と(2)のアドレスが同じものでした。 アドレスは割り当てたままに見えますが、実際にはちゃんと開放されているのでしょうか? それとも、何か間違えているでしょうか。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
完全な誤解です。 freeはポインタをNULLにしたりはしません。 NULLポインタをfreeしても安全であることは定められています。 この2つを混同し、freeされるとNULLになる と理解されたのでしょう。 多重解放を防止するために freeしたポインタに"自力で"NULLを入れるのは よくつかわれる手法です。 プログラムの条件分岐等でmallocがバイパスされる ことも考慮して、ポインタはNULLで初期化しておくと さらに安全です。
その他の回答 (2)
- asuncion
- ベストアンサー率33% (2127/6289)
>開放した後は●と同じくNULLになると思っていたのですが、 そもそも、関数内のローカル変数であるchar *型変数の初期値が NULLであることは未保証です。 NULLであることを、間違いなく確認されましたか? なお、ポインタの値を出力する際の書式文字列は"%p"です。 "%d"ではありません。
お礼
有難うございます。 本にも%pと書いてあったのですが、%pだと16進数で直感的に分かりづらかったので・・・
- Wr5
- ベストアンサー率53% (2173/4061)
すでに回答ついていますので補足的に。 free()にポインタ変数の「アドレス」を渡していないので、どうがんばってもfree()内で引数に渡したポインタ変数の中身をNULLにすることはできません。 # defineで妙なコトやっていたりしたら別ですが…。
お礼
なるほど。有難うございます。わかりました。
お礼
有難うございます。 慣れない難しい言い回しが多いですね。 色々な誤解から変な疑問がたくさんわきます。 また何かあったら質問させてください。