织梦网站动态,wordpress解析完403,东莞网站建设 乐云践新,前端入职一周被劝退前言 #xff08;1#xff09;几天前在一个交流群中看到有人说#xff0c;面试问malloc(0)会怎么样是真的恶心。 #xff08;2#xff09;这个突然激起了我的好奇心。居然还可以malloc(0)#xff1f;#xff01; #xff08;3#xff09;经过测试最后#xff0c;发现…前言 1几天前在一个交流群中看到有人说面试问malloc(0)会怎么样是真的恶心。 2这个突然激起了我的好奇心。居然还可以malloc(0) 3经过测试最后发现是可行的。经过互联网的查找肯哥的交流群以及自己的理解梳理成这篇博客。 4肯哥博客主页架构师李肯 5感慨一下群里面的大佬们不愧是有多年开发经验。看待问题一针见血。一下子就找到了问题所在自己还是太肤浅了。顺便提一句听说C陷阱这本书里面也有讲解这部分的知识。虽然久仰大名但是一直没买。 malloc(0)运行结果 1我使用printf打印出指针指向的区域。然后使用malloc_usable_size()函数检测申请到的内存大小。顺便使用strcpy函数检测该区域是否传入数据。 2结果发现程序可以正常运行。没有报错不是空指针从malloc_usable_size()函数返回的结果来看申请到了一个24字节的空间。 #include stdio.h
#include stdlib.h
#include malloc.h
#include string.hint main()
{char* pmalloc(0);printf(p %p \r\n,p);strcpy(p,abc); printf(malloc_usable_size(p) %ld \r\n,malloc_usable_size(p));free(p);p NULL;return 0;
}代码解析 1查阅的网上的各式各样的资料之后术语太多真心看不太懂。于是就打算在肯哥的交流群问问。本来自认为问出了一个高质量的问题。没想到真小丑啊哈哈哈哈。 2群昵称 码匠许师傅-9年 的大佬马上给我扔出来一个链接这个直接是C语言的官方定义里面明确表明了如果malloc传入0会产生的结果。 3官方解释 If size is zero, the behavior is implementation defined (null pointer may be returned, or some non-null pointer may be returned that may not be used to access storage, but has to be passed to std::free). 翻译结果如果尺寸为零行为是实现定义的可能返回空指针或者可能返回一些可能不用于访问存储但必须传递给 std::free 的非空指针。 4什么意思呢 1也就是说如果malloc传入的值是0那么这个行为可以被允许通过的。 2但是这个行为最后产生的结果是返回的一个空指针或者是一些可能不能被访问的内存。注意这里是可能不能被访问我上面运行结果显示可以被访问并不冲突 3最后这里还表明这个malloc返回的值最终需要经过free()函数进行释放。 5那么还有一个问题为什么我这里malloc0返回的是一个24字节的空间呢这个所有人的都是24字节吗 不是的通过查阅网上的资料显示不同环境下malloc(0)返回的空间可能不同。 malloc(-1)是否被允许 1既然malloc(0)是被允许的那么malloc(-1)呢从运行结果来看是会出现报错的。 3为什么malloc(0)可以而malloc(-1)不行呢这是因为在C标准中规定了malloc中传入的参数必须为无符号数据。但是我查看网络上的资料发现有些人说传入-1是可以运行通过的可能是编译器存在问题将-1解析成了0xff ff ff ff一般来说数字默认4字节而-1补码是这个。 总结 1malloc(0)这个行为是被C语言标准所允许的。 2malloc(0)返回的不一定是空指针不同环境产生的结果不同。 3malloc(0)返回的指针指向的空间可能不能被访问。再次强调是可能 4malloc(0)返回空间要根据环境来定。 5malloc(0)所产生的指针需要传递给free()进行释放。