首页 > 其他分享 >C语言---malloc(0)会产生什么结果,真的是空指针吗?

C语言---malloc(0)会产生什么结果,真的是空指针吗?

时间:2023-07-31 14:01:36浏览次数:41  
标签:返回 malloc include free C语言 --- size 指针


前言

(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.h>

int main()
{
	char* p=malloc(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;
}

C语言---malloc(0)会产生什么结果,真的是空指针吗?_#include

代码解析

(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)那么还有一个问题,为什么我这里malloc(0)返回的是一个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补码是这个)。

C语言---malloc(0)会产生什么结果,真的是空指针吗?_#include_02

总结

(1)malloc(0)这个行为是被C语言标准所允许的。
(2)malloc(0)返回的不一定是空指针,不同环境产生的结果不同。
(3)malloc(0)返回的指针指向的空间,可能不能被访问。(再次强调,是可能!!!)
(4)malloc(0)返回空间,要根据环境来定。
(5)malloc(0)所产生的指针,需要传递给free()进行释放。


标签:返回,malloc,include,free,C语言,---,size,指针
From: https://blog.51cto.com/zyxfighting/6907978

相关文章

  • do-while(0)语句到底有什么用?
    前言在一个群里面看到一个人问,do-while(0)语句有什么用?do-while(0)这个程序最终结果不应该就是程序只跑一次,那么写和不写有什么区别呢?do-while(0)在复杂宏定义上的优点为什么需要复杂宏(1)在讲解do-while(0)在复杂宏定义上的优点前,我先介绍一下复杂宏的好处。(2)当我们看到一个宏定义......
  • 洛谷-P9485 题解
    写在前面:这是蒟蒻交的第一篇绿题题解(大祭),因为线性做法比较难想,本篇会着重讲述用RMQ问题求解,并尽可能用清晰明了的图片和简易的文字讲明白。正文最坏时间复杂度:\(\mathcal{O}(\sumn+\log\sumn)\)在求解之前,先让我们想个问题,如何求解积水格数?再简单点,对于每个\(i\),其积水......
  • X86架构CPU下Ubuntu系统环境源码编译pytorch-gpu-2.0.1版本
    本文操作步骤与aarch64架构CPU下Ubuntu系统环境源码编译pytorch-gpu-2.0.1版本大致相同,只是CPU架构不同而已,因此这里只记录不同的地方。 重点:一个个人心得,那就是要编译pytorch源码最好是选择docker环境,因为这种环境下配置比较纯净,一定要避免那种自己使用多年的Linux系统,那种......
  • 做题记录 2023.7.31-
    \(2023.7.31-2023.8.6\)\(\color{royalblue}{P3115}\)分层图,注意建边方式,题面好烂。\(\color{royalblue}{P6554}\)换根DP,考虑设\(g_i=ans_i*cnt_i\)。\(cnt_i\)为节点\(i\)子树内叶子结点个数。......
  • 从 C++到 Objective-C ----2
    从C++到Objective-C(7):继承简单继承Objective-C也有继承的概念,但是不能多重继承。不过,它也有别的途径实现类似多重继承的机制,这个我们后面会讲到。C++Objective-CclassFoo:publicBar,{}@interfaceFoo:Bar//单继承//如果要同时“继承”Wiz,需要使用......
  • 从 C++ 到Objective-C
    从C++到Objective-C(1):前言DevBean 日期:2011年03月18日Objective-C可以算作Apple平台上“唯一的”开发语言。很多Objective-C的教程往往直接从Objective-C开始讲起。不过,在我看来,这样做有时候是不合适的。很多程序员往往已经掌握了另外一种开发语言,如果对一门新......
  • OSPF-LSA链路状态通告信息
    前言:同一区域的OSPF路由器拥有完全相同的LSDB,在区域内部,OSPF采用SPF算法完成路由计算,路由器为了完成路由计算,会消耗内存、CPU的资源,通过区域划分可以在一定程度上缓解路由器的压力,在大规模网络中除了使用OSPF路由协议,还可能存在其他协议。OSPF支持引入外部路由协议,从而使得OSPF知......
  • python 把日期和时间合并%Y-%m-%d %H:%i:%S
    Python中日期和时间的合并在Python中,我们经常需要将日期和时间合并在一起使用。合并后的日期和时间可以用于生成时间戳、记录事件、计算时间差等。本文将介绍如何使用Python将日期和时间合并,并通过代码示例演示其用法。日期和时间的合并在Python中,日期和时间可以分别表示为date......
  • VUE el-table表格实现双击编辑,单机空白处放弃修改,回车提交修改
    VUEel-table表格实现双击编辑,单机空白处放弃修改,回车提交修改template<el-row><el-col:span="24"><el-table@cell-dblclick="handleCellDBClick":data="tabledata"border><!--生成列--><......
  • 【TCP】学习笔记:application/octet-stream
    当浏览器在请求资源时,会通过http返回头中的content-type决定如何显示/处理将要加载的数据,如果这个类型浏览器能够支持阅览,浏览器就会直接展示该资源,比如png、jpeg、video等格式。在某些下载文件的场景中,服务端可能会返回文件流,并在返回头中带上Content-Type:application/octet-st......