|
申请空间时malloc(0)会发生什么?
有读者提到以前面试的时候被问到过这个题,正好我刚毕业的时候也被问过,当时内心还一阵腹诽,这道面试题又是会被喷没有意义的题,个人也感觉研究这种没什么意义,不过知道下还是没有坏处的。
#include #include
int main(){ char* p = (char*)malloc(0); printf("Pointer address: %p
", (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 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嵌入式所有知识点-思维导图
|
|