申请空间时malloc(0)会发生什么?
有读者提到以前面试的时候被问到过这个题,正好我刚毕业的时候也被问过,当时内心还一阵腹诽,这道面试题又是会被喷没有意义的题,个人也感觉研究这种没什么意义,不过知道下还是没有坏处的。
int main()
{
char* p = (char*)malloc(0);
printf("Pointer address: %p\n", (void*)p);
return 0;
}
按照第一反应,这种时候应该返回空指针NUL,毕竟你没有申请到空间地址,动手实践在Windows上和Linux上分别运行,发现都打印出了地址
//Windows
Pointer address: 000001ABC6A161B0
//linux
Pointer address: 0xe5e260
实际动手可以发现,mallc(0)返回的指针不是空指针。
其实这种涉及到标准库的问题,直接看标准就行,cppreference上对malloc为0的情况有明确的说明:
malloc
C 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嵌入式所有知识点-思维导图