当前位置: 首页 > news >正文

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

前言

(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;
}

在这里插入图片描述

代码解析

(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补码是这个)。

在这里插入图片描述

总结

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

http://www.lryc.cn/news/93526.html

相关文章:

  • 建模助手618 | 谁不囤点Revit插件我都会生气!
  • 【“职场程序员是否会保护自己的隐私?为何要求程序员之间保密薪资?”】
  • 企业工程管理系统源码之提高工程项目管理软件的效率
  • 创新指南 | 推动销售的17个可落地的集客式营销示例
  • ASEMI代理光宝光耦LTV-0314的应用与优势
  • Apikit 自学日记: Apikit 如何发起测试
  • python-glob模块_表格及代码样例
  • GitHub Copilot 最全安装、使用
  • C语言 指针(特别篇)
  • 【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月26日论文合集)
  • 网络编程与自动化(python)
  • 有趣的数学 对称/非对称加密简史及数学原理一览
  • AI大模型落地不远了!首个全量化Vision Transformer的方法FQ-ViT(附源代码)
  • YouTubeDNN
  • 面向对象的介绍和内存
  • 【数据可视化】Plotly Express绘图库使用
  • 小红书企业号限流原因有哪些,限流因素
  • 1.6C++双目运算符重载
  • CDD诊断数据库的简单介绍
  • 【笔试强训选择题】Day25.习题(错题)解析
  • Python心经(6)
  • MMPose安装记录
  • 梯度下降优化
  • 一起看 I/O | 将 Kotlin 引入 Web
  • 极致呈现系列之:Echarts地图的浩瀚视野(一)
  • 第四章 模型篇:模型训练与示例
  • 利用人工智能模型学习Python爬虫
  • .Net泛型详解
  • C++ 教程(10)——存储类
  • vue3+vite+element-plus创建项目,修改主题色