電子書籍の厳選無料作品が豊富!

下位にて動的に確保した領域を解放するのは以下のように
すればよいのでしょうか?また解放されているか確認する方法はあるのでしょうか?

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;

}

A 回答 (7件)

だいたいおっけ~。

でも、

・void main() → int main(); で、main() の最後に return 0;
・main() の char *p = 0x00; の初期化は意味がない。もしするとしたら p = NULL
・exit() は引数を省略できない
・malloc() の戻り値を確認するのは、0x00 より NULL の方が良い

というあたりが気になります。また、

> また解放されているか確認する方法はあるのでしょうか?

C言語一般としては、確認する方法がありません。コンパイラによっては手段が用意されていることがあります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
0x00とNULLって何か違うのでしょうか?

お礼日時:2002/12/19 14:36

ポインタとは何か?ということを理解してからでないと


ポインタを引数に持つ関数を呼び出すのは難しいと思います。

char a;
char *b;
char **c;

× c=&a;
○ c=&b;

× *c=a;
○ *c=b;
○ *c=&a;

ということです。
    • good
    • 0

> 下位への引数をダブルポインタにしなければなぜ上位で参照できないのでしょうか?


> 仕様でしょうか?それとも根本的に無理だからでしょうか?

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);

...ってことです
    • good
    • 0

> 0x00とNULLって何か違うのでしょうか?



コンパイラによっては、0 だったり (void*)0 とマクロで定義されていますが、規格で保証されているわけではありません。

# 実際に NULL が -1 と定義されている処理系もあり

また malloc() は、割り当てに失敗すると、無効なポインタを表す定数 NULL を返すことになっており、0 を返すと決められているわけではありません。

ただ、C++ の規格では、整定数 0 をポインタに変換すると、無効なポインタとして扱うように、と決められています。なので、NULL が -1 という処理系でも

  char* p = 0;

とやると、*正しく* 無効なポインタを指すことになります。

# C では、どうだったか忘れました (^^;
    • good
    • 0

MSVC++では



#define NULL 0

であり、まったく同じ。
その他の仕様では、下の方の言ってるとおり。

私みたいなやつは、NULLを書くとソースが横に長くなって見にくいので、NULLを書くべきところに0を書いたりします。
が、あんまいいことだとは思ってません(笑。

ちなみに#define NULL 0でないような仕様では

char *p = 0x00;

はエラーです。
ちなみに0x00はまったく0と変わりありません。
    • good
    • 0

こんにちは。


NULLは、コードでは、「0x0」ですが、C言語の
扱いでは、「(void*)0x0)」で、ポインタを意味
します。
もし、
int a;
memset( &a , NULL , sizeof( int ));
とすると、コンパイラによってはエラーになります。
    • good
    • 0

free(&p) あらため free(p) でしょうね。

    • good
    • 0
この回答へのお礼

下位への引数をダブルポインタにしなければなぜ上位で参照できないのでしょうか?
仕様でしょうか?それとも根本的に無理だからでしょうか?
free(p)が正しいのですか。もし下位でfreeするのであれば、free(*p)となるのでしょうか?

お礼日時:2002/12/19 14:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!