- ベストアンサー
free()への引数について
下位にて動的に確保した領域を解放するのは以下のように すればよいのでしょうか?また解放されているか確認する方法はあるのでしょうか? void main(){ char *p = 0x00; if (0 != exaMalloc(&p)) { printf("err\n"); exit(); } free(&p); } int exaMalloc(**p) { *p = malloc(10); if (*p == 0x00) { return -1; } return 0; }
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
だいたいおっけ~。でも、 ・void main() → int main(); で、main() の最後に return 0; ・main() の char *p = 0x00; の初期化は意味がない。もしするとしたら p = NULL ・exit() は引数を省略できない ・malloc() の戻り値を確認するのは、0x00 より NULL の方が良い というあたりが気になります。また、 > また解放されているか確認する方法はあるのでしょうか? C言語一般としては、確認する方法がありません。コンパイラによっては手段が用意されていることがあります。
その他の回答 (6)
- fruipa
- ベストアンサー率38% (14/36)
ポインタとは何か?ということを理解してからでないと ポインタを引数に持つ関数を呼び出すのは難しいと思います。 char a; char *b; char **c; × c=&a; ○ c=&b; × *c=a; ○ *c=b; ○ *c=&a; ということです。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 下位への引数をダブルポインタにしなければなぜ上位で参照できないのでしょうか? > 仕様でしょうか?それとも根本的に無理だからでしょうか? void increment(int x) { ++x; } int a = 3; increment(a); このコードで、aを4にすることができないでしょ? それと同じ事。 > free(p)が正しいのですか。もし下位でfreeするのであれば、free(*p)となるのでしょうか? void exaFree(void** p) { free(*p); } char* p; exaMalloc(&p); exaFree(&p); ...ってことです
- a-kuma
- ベストアンサー率50% (1122/2211)
> 0x00とNULLって何か違うのでしょうか? コンパイラによっては、0 だったり (void*)0 とマクロで定義されていますが、規格で保証されているわけではありません。 # 実際に NULL が -1 と定義されている処理系もあり また malloc() は、割り当てに失敗すると、無効なポインタを表す定数 NULL を返すことになっており、0 を返すと決められているわけではありません。 ただ、C++ の規格では、整定数 0 をポインタに変換すると、無効なポインタとして扱うように、と決められています。なので、NULL が -1 という処理系でも char* p = 0; とやると、*正しく* 無効なポインタを指すことになります。 # C では、どうだったか忘れました (^^;
- haporun
- ベストアンサー率40% (230/562)
MSVC++では #define NULL 0 であり、まったく同じ。 その他の仕様では、下の方の言ってるとおり。 私みたいなやつは、NULLを書くとソースが横に長くなって見にくいので、NULLを書くべきところに0を書いたりします。 が、あんまいいことだとは思ってません(笑。 ちなみに#define NULL 0でないような仕様では char *p = 0x00; はエラーです。 ちなみに0x00はまったく0と変わりありません。
- asaichi
- ベストアンサー率21% (37/171)
こんにちは。 NULLは、コードでは、「0x0」ですが、C言語の 扱いでは、「(void*)0x0)」で、ポインタを意味 します。 もし、 int a; memset( &a , NULL , sizeof( int )); とすると、コンパイラによってはエラーになります。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
free(&p) あらため free(p) でしょうね。
お礼
下位への引数をダブルポインタにしなければなぜ上位で参照できないのでしょうか? 仕様でしょうか?それとも根本的に無理だからでしょうか? free(p)が正しいのですか。もし下位でfreeするのであれば、free(*p)となるのでしょうか?
お礼
ありがとうございます。 0x00とNULLって何か違うのでしょうか?