面试题:申请空间时malloc(0)会发生什么?

科技   2024-10-09 14:17   江苏  




申请空间时malloc(0)会发生什么?

有读者提到以前面试的时候被问到过这个题,正好我刚毕业的时候也被问过,当时内心还一阵腹诽,这道面试题又是会被喷没有意义的题,个人也感觉研究这种没什么意义,不过知道下还是没有坏处的。

#include <stdio.h>#include <stdlib.h>
int main(){ char* p = (char*)malloc(0); printf("Pointer address: %p\n", (void*)p);
return 0;}

按照第一反应,这种时候应该返回空指针NUL,毕竟你没有申请到空间地址,动手实践在Windows上和Linux上分别运行,发现都打印出了地址

//WindowsPointer address: 000001ABC6A161B0

//linuxPointer address: 0xe5e260

实际动手可以发现,mallc(0)返回的指针不是空指针。

其实这种涉及到标准库的问题,直接看标准就行,cppreference上对malloc为0的情况有明确的说明:

mallocC Dynamic memory management Defined in header <stdlib.h>void *malloc( size_t size );
If size is zero, the behavior of malloc is implementation-defined. For example, a null pointer may be returned. Alternatively, a non-null pointer may be returned; but such a pointer should not be dereferenced, and should be passed to free to avoid memory leaks.

the behavior of malloc is implementation-defined.是什么意思?

意思就是当malloc接收到一个大小为0的请求时,其行为是由实现定义的。也就是说不同的实现可以选择不同的处理方式

返回NULL:

许多实现选择在这种情况下返回NULL,因为分配0字节的内存没有实际用途。

返回非空指针:

有些实现可能会返回一个非空指针。这个指针不应被解引用(dereference),并且应该传递给free函数以避免内存泄漏。


总结:

malloc(0)的返回值由实现编译器的人定义,可以是NULL,也可以是一个非空指针,深究没多大意义。

end



一口Linux 


关注,回复【1024】海量Linux资料赠送


精彩文章合集

文章推荐

【专辑】ARM
【专辑】粉丝问答
【专辑】所有原创
专辑linux入门
专辑计算机网络
专辑Linux驱动
【干货】嵌入式驱动工程师学习路线
【干货】Linux嵌入式所有知识点-思维导图


一口Linux
《从零开始学ARM》作者,一起学习嵌入式,Linux,网络,驱动,arm知识。
 最新文章