1

私は何かから混乱しています。

最初:

int *ptr;
ptr = malloc(10 * sizeof(int));

このタイプは、配列のようにコンパイル時にではなく、実行時に動的 (ヒープ) メモリを取得します。

malloc()記憶がない場合は返却NULLする場合があります。

そしてNULL#define標準 C ライブラリにある#define NULL ((void *)0)

したがって、malloc戻り値NULLが実行時に実行される場合、コンパイラがどのように置換NULLするか、void *0およびテキスト置換がプリコンパイル段階で発生することがわかっています

4

5 に答える 5

5

いいえ、あなたは間違っています。malloc次のような関数を想像してください。

void *malloc(size_t n)
{
    /* magic */
    return NULL;
}

NULL コンパイラは、その翻訳単位がコンパイルされるときに置き換えます。つまり、標準ライブラリがコンパイルされるとNULL、プリプロセッサ フェーズを過ぎても痕跡が残りません。それ以降は、malloc は数値を返すだけです。

于 2012-09-09T15:03:26.520 に答える
1

コンパイル後、すべての NULL は ((void *)0) に置き換えられました。メモリがない場合、malloc は ((void *)0) を返すだけです。

于 2012-09-09T15:02:38.830 に答える
1

(void*)0 を返します。これは、ソース コードのどこかで次のように NULL と比較できます。

   int *ptr;
   ptr = malloc(10 * sizeof(int));
   if(ptr == NULL) 
       //do something

コンパイラはNULL、if 式ではなく if 式を置き換えます。ptr

于 2012-09-09T15:03:26.133 に答える
0

((void *)0)は plain と同じで0、 type に型キャストされているだけvoid *です。そのため、たとえばif (!myPointer)、ポインターが ではないかどうかを確認するために使用できますNULL。はpalinNULLと同じで、常にである必要があるため、 in で0NULLを定義したかは問題ではありません。mallocNULL 0

古いライブラリでは、まだ珍しいことではありませんが、NULLplain として定義されてい0ました。C++ では、plain0が一般的に の代わりに使用されNULLます。

于 2012-09-09T15:04:30.747 に答える
0

は任意の型void*のポインターを「運ぶ」ことができるという事実を思い出してください。

例:

void *h;
int *p, **pp;

h = p;
h = pp;

そのため、malloc が失敗すると、他の回答が指摘したように、C で (void*)0 として定義されている NULL が返されます。

于 2012-09-09T15:04:40.920 に答える