关于malloc(0)返回值的一些看法

本文探讨了在C语言中,当malloc函数接收到0作为参数时的行为。实验表明,即使传入0,malloc也可能返回一个合法的指针,而非空指针。这引发了一场关于库函数设计合理性的讨论。

题目来自https://www.jobui.com/mianshiti/it/qianrushi/5829/

以下是原文

下面的代码片段的输出是什么,为什么?

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”。我用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正确。得到正确的答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。

其实malloc(0)返回的不是空指针也不足为其,在linux下用man命令查看malloc函数

The  malloc() function allocates size bytes and returns a pointer to the allocated memory.  The memory is not initialized.  If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().

说明它确实会有可能申请内存成功的。

malloc申请的内存,一般都会比实质申请的要大,它会去堆空间里面找出一块>=需要申请的内存大小的空闲内存出来,所以malloc里面0值的处理应该是和其他的一样的,就算申请出来,也不会使用它。比如,你申请了一个20字节的空间,malloc返回的是25个字节的空间,你会去使用超出20字节的空间吗?我觉得,malloc开发时就考虑到大家都不会用malloc去申请一个0大小的空间,因为这样没意义,所以也没必要去判断申请的内存大小是否为0了。返回NULL一般是没有足够的空间了,申请空间失败才返回NULL。

1.new/delete 与 malloc/free 的区别? 2.引用与指针的区别? 3.什么是深拷贝, 什么是浅拷贝? 4.形参与实参的区别? 5.static在 C++中的作用? 6.说说你对c和c++的看法,c和c++的区别? 7.介绍一下C++里面的多态? 8.继承机制中对象之间如何转换?指针和引用之间如何转 换? 9.什么是类的继承? 10.什么是组合? 11.组合与继承优缺点? 12.继承机制中对象之间如何转换?指针和引用之间如何转 换? 13.组合与继承优缺点? 14.重载与重写的区别 15.隐藏和重写、重载的区别 16.C语言struct和C++struct区别? 17.构造函数为什么不能为虚函数?析构函数为什么要虚函 数? 18.析构函数的作用,如何起作用? 19.构造函数和析构函数可以调用虚函数吗,为什么? 20.虚析构函数的作用,父类的析构函数是否要设置为虚函 数? 21.构造函数析构函数可以调用虚函数吗? 22.构造函数析构函数可否抛出异常 23.类如何实现只能静态分配和只能动态分配? 24.抽象基类为什么不能创建对象? 25.类什么时候会析构? 26.为什么友元函数必须在类内部声明? 27.什么是左值右值? 28.new和delete的实现原理, delete是如何知道释放内 存的大小的额? 29.malloc申请的存储空间能用delete释放吗? 30.malloc、realloc、calloc的区别 31.stdcall和cdecl的区别? 32.lambda函数? 33.C++模板是什么,底层怎么实现的? 34.模板类和模板函数的区别是什么? 35.为什么模板类一般都是放在一个h文件中? 36.cout和printf有什么区别? 37.重载运算符? 38.C++类型转换有哪四种? 39.隐式转换,如何消除隐式转换? 40.迭代器++it,it++哪个好,为什么 41.C++如何处理多个异常的? 42.模板和实现可不可以不写在一个文件里面?为什么? 43.在成员函数中调用delete this会出现什么问题?对象还 可以使用吗? 44.智能指针的作用; 45.auto_ptr作用 46.使用智能指针管理内存资源,RAII是什么? 47.智能指针类的手动实现? 48.Denug和release的区别 49.虚函数与纯虚函数的区别在于 50.智能指针怎么用?智能指针出现循环引用怎么解决? 2.STL 2.1 vector与list的区别与应用?怎么找某vector或者list 的倒数第二个元素 2.2 STL vector的实现,删除其中的元素,迭代器如何变 化?为什么是两倍扩容?释放空间? 2.3 容器内部怎么删除一个元素 2.4 STL迭代器如何实现 2.5 set与hash_set的区别 2.6 hashmap与map的区别 2.7 map、set是怎么实现的,红黑树是怎么能够同时实现 这两种容器? 为什么使用红黑树? 2.8 map插入方式有几种? 2.9 STL中unordered_map(hash_map)和map的区别, hash_map如何解决冲突以及扩容 2.10 vector越界访问下标,map越界访问下标?vector删 除元素时会不会释放空间? 2.11 map[]与find的区别? 2.12 STL中list与queue之间的区别 2.13 STL中的allocator,deallocator 2.14 STL中hash_map扩容发生什么? 2.15 map如何创建? 2.16 vector的增加删除都是怎么做的?为什么是1.5倍?
最新发布
08-25
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值