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

简介: 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()进行释放。

目录
相关文章
|
1月前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别
pymalloc 和系统的 malloc 有什么区别
|
2月前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
52 0
|
12天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
1月前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别?
pymalloc 和系统的 malloc 有什么区别?
|
2月前
|
程序员 编译器 C语言
C中的 malloc 和C++中的 new 有什么区别
在C语言中,`malloc`函数用于在运行时分配内存,返回指向所分配内存的指针,需显式包含头文件 `&lt;stdlib.h&gt;`。而在C++中,`new`不仅分配内存,还对其进行构造初始化,且直接使用类型声明即可,无需额外包含头文件。`new`还支持数组初始化,能更好地融入C++的面向对象特性,而`malloc`仅作为内存分配工具。使用完毕后,`free`和`delete`分别用于释放`malloc`和`new`分配的内存。
62 21
|
2月前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
20 2
|
2月前
|
C语言
如何避免 C 语言中的野指针问题?
在C语言中,野指针是指向未知内存地址的指针,可能引发程序崩溃或数据损坏。避免野指针的方法包括:初始化指针为NULL、使用完毕后将指针置为NULL、检查指针是否为空以及合理管理动态分配的内存。
|
2月前
|
C语言
C语言:哪些情况下会出现野指针
C语言中,野指针是指指向未知地址的指针,通常由以下情况产生:1) 指针被声明但未初始化;2) 指针指向的内存已被释放或重新分配;3) 指针指向局部变量,而该变量已超出作用域。使用野指针可能导致程序崩溃或不可预测的行为。
|
2月前
|
存储 C语言
C语言32位或64位平台下指针的大小
在32位平台上,C语言中指针的大小通常为4字节;而在64位平台上,指针的大小通常为8字节。这反映了不同平台对内存地址空间的不同处理方式。
|
2月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。