内存分配和NULL指针

时间:2012-09-09 15:00:03

标签: c

我对此感到困惑。

第一

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

这种类型的获取动态(堆)内存在运行时,而非编译时,如数组。

如果没有记忆,

malloc()可能会返回NULL

NULL是标准C资源库#define

中的#define NULL ((void *)0)

因此,如果malloc返回NULL并且它在运行时执行,那么编译器将如何用NULL替换void *0和我知道任何文本替换发生在预编译阶段

5 个答案:

答案 0 :(得分:5)

不,你错了。想象malloc函数是这样的:

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

当编译该转换单元时,编译器会替换NULL ,即编译标准库时,NULL的跟踪不会超过预处理器阶段。在那之后,为了它的价值,malloc只返回数字。

答案 1 :(得分:1)

编译完成后,所有的NULL都被((void *)0)替换。 如果没有内存,malloc只返回((void *)0)。

答案 2 :(得分:1)

它返回(void *)0,可以在源代码中的某处与NULL进行比较,如:

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

编译器替换if表达式中的NULL而不是ptr

答案 3 :(得分:0)

表达式((void *)0)与普通0相同,它只是类型为void *。这就是为什么你可以使用例如if (!myPointer)检查指针不是NULL。由于NULL与palin 0相同,NULLmalloc定义的内容并不重要,因为NULL 总是必须是0

在较旧的库中,并且仍然不常见,NULL过去被定义为普通0,而在C ++中,0通常使用NULL而不是{{1}}。< / p>

答案 4 :(得分:0)

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

示例:

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

h = p;
h = pp;

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