下面的代码片段输出是什么?为什么?
char *ptr;
if((ptr = (char *)malloc(0))==NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
解析:......故意把0值传给了函数malloc,得到了一个合法的指针,这就是上面的代码,该代码的输出是"Got a valid pointer"
这个“解析”根本就没有解析嘛。好在查资料很方便,《C语言参考手册》上说“如果请求的长度为0,则标准C语言函数返回一个null指针或不能用于访问对象的非null指针。”或者你也可以直接在linux里man malloc来查阅手册:
void *malloc(size_t size);
...
malloc() allocates size bytes and returns a pointer to the allocated memory.
The memory is not cleared. If size is 0, then malloc() returns either NULL, or a
unique pointer value that can later be successfully passed to free().
可见,原题的if是为了鉴别malloc()返回值是NULL,还是一个唯一的待释放指针;而不是“解析”中的必然是非NULL的“合法指针”,因此输出也不是确定的,尽管我用gcc和clang多次编译运行,输出都是"Got a valid pointer"。
将程序改成:
char *ptr;
if(int pp = (strlen(ptr=(char *)malloc(0))) == 0)
puts("Got a null pointer");
else
puts("Got a valid pointer");
此时malloc(0)返回了一个可用于free()释放的唯一指针(非NULL),而且将它传给strlen(),返回值为0,这样看来,
它用'\0'进行填充的