当前位置: 首页 > 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()进行释放。

相关文章:

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

前言 &#xff08;1&#xff09;几天前在一个交流群中看到有人说&#xff0c;面试问malloc(0)会怎么样是真的恶心。 &#xff08;2&#xff09;这个突然激起了我的好奇心。居然还可以malloc(0)&#xff1f;&#xff01; &#xff08;3&#xff09;经过测试最后&#xff0c;发现…...

建模助手618 | 谁不囤点Revit插件我都会生气!

大家好&#xff0c;这里是建模助手。 早在5月份&#xff0c;我们已经就“618”这个事情高调了一番&#xff0c;以提前放“价”的姿势&#xff0c;让许多用户以躺赢的状态拉开了年中大促的序幕。&#xff08;5月购买的盆友&#xff0c;切记看完全文&#xff0c;内附彩蛋 活动反…...

【“职场程序员是否会保护自己的隐私?为何要求程序员之间保密薪资?”】

职场程序员之间确实有一些秘密&#xff0c;其中之一便是对薪资保密。这并非完全是程序员们的独立行为&#xff0c;而是因为一些公司或组织规定员工之间不能互相透露薪水信息。 第一个原因是保护公司自身利益。如果一个程序员知道其他同事的薪资水平比自己高&#xff0c;他可能…...

企业工程管理系统源码之提高工程项目管理软件的效率

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中&#xff0c;管理不畅以及不良的项目执行&#xff0c;往往会导致项目延期、成本上升、回款拖后&#xff0c;最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统&#xff0c;确保…...

创新指南 | 推动销售的17个可落地的集客式营销示例

无论您是开启集客式的营销有一段时间还是处于起步阶段&#xff0c;了解像您这样的企业是如何粉碎竞争对手的的集客式策略总是有帮助的。无论您的公司做什么&#xff0c;它所服务的行业&#xff0c;是B2B还是B2C &#xff0c;您都可以在这里找到许多可以使用的示例。 在本文中&…...

ASEMI代理光宝光耦LTV-0314的应用与优势

编辑-Z 在电子设备的设计和制造过程中&#xff0c;光耦合器是一种至关重要的组件。它们在电路中起到隔离作用&#xff0c;保护电子设备免受电压冲击和电流过载的影响。今天&#xff0c;我们将深入探讨一种特殊的光耦合器——LTV-0314&#xff0c;它的特性、应用以及优势。 一、…...

Apikit 自学日记: Apikit 如何发起测试

进入 API 文档详情页&#xff0c;点击上方 测试 标签&#xff0c;进入 API 测试页&#xff0c;系统会根据API文档自动生成测试界面并且填充测试数据。 填写请求参数 首先填写好请求参数。 请求头部 您可以输入或导入请求头部。批量导入的数据格式为 key : value &#xff0c;…...

python-glob模块_表格及代码样例

glob模块 文章目录 glob模块1. glob.glob(pathname)&#xff1a;根据指定的模式匹配文件路径&#xff0c;并返回匹配的路径列表2. glob.iglob(pathname)&#xff1a;返回一个迭代器&#xff0c;逐个匹配文件路径&#xff0c;适用于大量文件的情况3. glob.escape(pathname)&…...

GitHub Copilot 最全安装、使用

GitHub Copilot 最全安装、使用教程 一、温馨提示 GitHub Copilot 目前为止可以免费试用一个月&#xff0c;但是试用的前提是必须要绑定银行卡&#xff0c;因为后续会自动扣费&#xff0c;所以请注意试用结束日期&#xff0c;自己定好闹钟关闭订阅。 订阅价格为每月10美刀&a…...

C语言 指针(特别篇)

本篇目录 C语言 指针&#xff08;特别篇&#xff09;内存地址简要介绍C语言指针C语言的指针可以指向什么?取地址符 &&#xff08;Address-of Operator&#xff09;C语言中的 * 号运算符示例集&#xff1a;指向变量的指针指向数组的指针指向字符串的指针二级指针指针数组的…...

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月26日论文合集)

文章目录 一、检测相关(9篇)1.1 Energy-based Detection of Adverse Weather Effects in LiDAR Data1.2 Anomaly Detection with Conditioned Denoising Diffusion Models1.3 Mask Attack Detection Using Vascular-weighted Motion-robust rPPG Signals1.4 Improved Multi-Sca…...

网络编程与自动化(python)

20.1 网络编程与自动化概述 传统网络运维困境大家在日常的网络运维中是否遇到过如下问题: 设备升级:现网有数千台网络设备,你需要周期性、批量性地对设备进行升级。配置审计:企业年度需要对设备进行配置审计。例如要求所有设备开启sTelnet功能,以太网交换机配置生成树安全…...

有趣的数学 对称/非对称加密简史及数学原理一览

一、非对称加密简史 1、算法建立 对于任何想发送加密信息的人&#xff0c;另一个问题是如何让接收人知道这条信息一开始是如何加密的。对于像字母替换式密码这样的密码&#xff0c;问题在于&#xff0c;一旦窃听者知道了加密方案&#xff0c;后续的信息都可以轻松获取。 公钥加…...

AI大模型落地不远了!首个全量化Vision Transformer的方法FQ-ViT(附源代码)

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 论文地址&#xff1a;https://arxiv.org/pdf/2111.13824.pdf 项目代码&#xff1a;https://github.com/megvii-research/FQ-ViT 计…...

YouTubeDNN

这个youTubeDNN主要是工程导向&#xff0c;对于推荐方向的业界人士真的是必须读的一篇文章。它从召回到排序整个流程都做了描述&#xff0c;真正是在工业界应用的经典介绍。 作者首先说了在工业上YouTube视频推荐系统主要面临的三大挑战&#xff1a; 1.Scale(规模)&#xff1…...

面向对象的介绍和内存

学习面向对象内容的三条主线 • Java 类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类 • 面向对象的特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09; • 其他关键字的使用…...

【数据可视化】Plotly Express绘图库使用

Plotly Express是一个基于Plotly库的高级Python可视化库。它旨在使绘图变得简单且直观&#xff0c;无需繁琐的设置和配置。通过使用Plotly Express&#xff0c;您可以使用少量的代码创建具有丰富交互性和专业外观的各种图表。以下是Plotly Express的一些主要特点和优势&#xf…...

小红书企业号限流原因有哪些,限流因素

作为企业、品牌在小红书都有官方账号&#xff0c;很多人将注册小红书企业号看作是获取品牌宣推“特权”的必行之举。事实真的如此吗&#xff0c;那为什么小红书企业号限流频发&#xff0c;小红书企业号限流原因有哪些&#xff0c;限流因素。 一、小红书企业号限流真的存在吗 首…...

1.6C++双目运算符重载

C双目运算符重载 C中的双目运算符重载指的是重载二元运算符&#xff0c;即有两个操作数的运算符&#xff0c;如加减乘除运算符“”、“-”、“*”和“/”等。 通过重载双目运算符&#xff0c;可以实现自定义类型的运算符操作。 比如可以通过重载加减运算符实现自定义类型的向…...

CDD诊断数据库的简单介绍

1. 什么是数据库? 数据库是以结构化方式组织的一个数据集合。 比如DBC数据库: Network nodes Display Rx Messages EngineState(0x123) 通过结构化的方式把网络节点Display里Rx报文EngineState(0x123)层层展开。这种方 式的好处是:层次清晰,结构分明,易于查找。 2. 什么…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...