我对此感到困惑。
第一
int *ptr;
ptr = malloc(10 * sizeof(int));
这种类型的获取动态(堆)内存在运行时,而非编译时,如数组。
如果没有记忆, malloc()
可能会返回NULL
。
NULL
是标准C资源库#define
#define NULL ((void *)0)
因此,如果malloc
返回NULL
并且它在运行时执行,那么编译器将如何用NULL
替换void *0
和我知道任何文本替换发生在预编译阶段
答案 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
相同,NULL
中malloc
定义的内容并不重要,因为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,正如其他答案所指出的那样。