1

我对某事感到困惑。

第一的:

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

这种在运行时获取动态(堆)内存,而不是像数组那样在编译时获取。

malloc()NULL如果没有内存可能会返回。

并且NULL#define标准 C 库中的一个#define NULL ((void *)0)

因此,如果malloc返回NULL并在运行时执行,编译器将如何替换NULLvoid *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

编译器替换NULLif 表达式中的ptr

于 2012-09-09T15:03:26.133 回答
0

表达式((void *)0)与 plain 相同0,只是类型转换为 type void *。这就是为什么您可以使用 egif (!myPointer)来检查指针不是NULL. 和palinNULL一样,在 中定义0什么并不重要,总是必须如此。NULLmallocNULL 0

在较旧的库中,并且仍然很常见,NULL曾经被定义为 plain 0,而在 C++ 中, plain0通常用于代替NULL.

于 2012-09-09T15:04:30.747 回答
0

回想一下void*可以“携带”任何类型指针的事实。

例子:

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

h = p;
h = pp;

因此,如果 malloc 失败,它将返回 NULL,在 C 中定义为 (void*)0,正如其他答案所指出的那样。

于 2012-09-09T15:04:40.920 回答