2012-09-09 131 views
1

我对某事感到困惑。内存分配和NULL指针

第一:

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

这种类型在运行时获得动态(堆)存储,而不是编译时间像阵列。

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

而且NULL是在标准C库中的#define#define NULL ((void *)0)

所以,如果mallocNULL和处执行运行时,编译器将如何替代NULLvoid *0,我知道,任何文本替换发生在预编译阶段

+0

严格来说,'malloc'不会返回NULL。它返回一个类型为“void *'的空指针。宏'NULL'被定义为扩展为一个表达式,该表达式的结果是一个类型为“void *”的空指针,或者是一个整数常量(任何整数类型),其值为0。因此,值'malloc'在失败时返回等于'NULL',但不一定与'NULL'类型相同,并且肯定不是'NULL'本身,因为'NULL'是一个宏,它没有任何意义一个函数来“返回一个宏”。函数返回值。 –

回答

5

替换NULL不,你错了。试想malloc功能是这样的:

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

编译器替换NULL当翻译单元编译,即当标准库编译所以没有NULL幸存过去的预处理程序阶段跟踪。在那之后,对于它的价值,malloc只返回数字。

+0

谢谢,你把我推向了我错过的正确理念。 :)) –

1

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

1

它返回(无效*)0,可以在某处有一个空的源代码进行比较,这样的:

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

编译器中,如果表达不ptr

0

表达式((void *)0)与普通0相同,只是针对void *这一类型进行了说明。这就是为什么你可以使用例如if (!myPointer)检查指针不是NULL。作为NULL是一样的佩林0,也无所谓什么NULLmalloc定义,为NULL总是必须0

在较旧的库,并且仍然并不少见,NULL用于被定义为纯0,并且在C++平原0是常用的代替NULL

0

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

实例:

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

h = p; 
h = pp; 

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