实际上malloc(0)这个语法是对的,也确实分配了内存,但内存空间是0,就是说返回指针是不能用的。malloc(0)的返回值可能是NULL也可能不是NULL,和实参为一个正整数时没什么区别。如果返回值不为NULL,也应该用free()函数释放。malloc(0)唯一不同的地方就是,就算你申请内存成功,即malloc(0)返回值不为NULL,你也没法使用这块内存。

《C语言参考手册》上说“如果请求的长度为0,则标准C语言函数返回一个null指针或不能用于访问对象的非null指针。”

void *malloc(size_t size);

...

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

栈有自己的机器指令,是一个先进后出的数据结构。malloc分配的内存是堆内存,由于堆没有自己的机器指令,所以要有系统自己编写算法来管理这片内存,通常的做法是用链表,在每片被分配的内存前加个表头,里面存储了被分配内存的起始地址和大小,你的malloc返回的就是表头里的起始指针,这个地址是由一系列的算法得来了,通常不会为0,一旦分配成功,就返回一个有效的指针,对于分配0空间来说,算法已经算出可用内存的起始地址,但是你占用0空间,所以对那个指针操作就是错误的,操作系统一般不知道其终止地址,因为有占用大小就可以推出终止地址,还有就是即使分配0空间也要释放它,其实是释放的链表结点。还有,返回的指针是可用地址的起始地址,可用大小是固定的。(是多少?)
char *ptr;
if(int pp = (strlen(ptr=(char *)malloc(0))) == 0)puts("Got a null pointer");
elseputs("Got a valid pointer");
char *ptr;
if(int pp = (sizeof(ptr=(char *)malloc(0))) == 4)puts("Got a null pointer");
elseputs("Got a valid pointer");

如果求ptr的strlen的值和sizeof的值,该代码的输出是"Got a null pointer"。

第一段程序,此时malloc(0)返回了一个可用于free()释放的唯一指针(非NULL),而且将它传给strlen(),返回值为0,这样看来,它用'\0'进行填充的(即内容是NULL而非指针指向NULL)。除此以外,顺便考察了strlen((char*)NULL)的行为:会导致段错误。
第二段程序呢,sizeof()里写了一大堆,其实只是计算了sizeof(char *),在32位机上结果当然是4,而sizeof()里面的malloc()根本没有执行。和前面两段代码不同,关键点不在malloc而是sizeof。
那么,如果给malloc()传一个负参数会怎么样?malloc()的参数是size_t类型,一般是无符号数,负值会被转化它对应于size_t中的对应值。当这个值大于malloc()所能分配的上限时,返回NULL。

A size_t value is always positiveeven if you pass a negative value to malloc.The negative value is converted to an unsigned value of type size_t which leads to a huge positive value.

Example:

char *p = malloc(-2);

is equivalent to:

char *p = malloc(SIZE_MAX- 1);  // SIZE_MAX is the maximum

// size_tvalue

【C】malloc(0)问题相关推荐

  1. malloc(0)-malloc 0 字节

    C17中有如下描述: 7.22.3 Memory management functions 1 The order and contiguity of storage allocated by suc ...

  2. ptr = (char *)malloc(0)

    char *ptr; if ((ptr = (char *)malloc(0)) == NULL) puts( "Got a null pointer "); else puts( ...

  3. malloc的内存分配之 malloc(0)的内存分配情况

    #include<iostream> using namespace std; int main() {char *p;if((p=(char *)malloc(0))==NULL)put ...

  4. 面试官问:malloc(0)时程序会返回什么?

    今天跟大家找了篇文章,主要是一个面试中的有趣问题,其实有些问题在开发中没有遇到过会很难回答出来,如果在面试过程中回答正确,皆大欢喜,拿到offer的概率更大:回答不出来也不要信口开河,面试官主要看的是 ...

  5. c语言malloc返回值,malloc(0)的返回值

    很多嵌入式c面试,会问到这个问题,我也就百度了下,集合几位网友的分析,记录下来,便于我自己随时查看 当malloc分配内存时它除了分配我们指定SIZE的内存块,还会分配额外的内存来存储我们的内存块信息 ...

  6. malloc()参数为0的情况

    问题来自于<程序员面试宝典(第三版)>第12.2节问题9(这里不评价<程序员面试宝典>,就题论题): 下面的代码片段输出是什么?为什么? char *ptr; if((ptr ...

  7. c++申请内存空间_有没有想过:malloc分配的内存空间地址连续吗

    来自公众号:技术让梦想更伟大 提出问题 我们在写程序中经常会用到malloc函数进行动态内存分配,但是我们有没有想过,在C语言中,向操作系统请求malloc内存空间的地址是连续的吗??? 测试 我使用 ...

  8. 使用malloc创建头结点的坑

    首先,malloc()是动态内存分配函数,用来向系统请求分配内存空间.当无法知道内存具体的位置时,想要绑定真正的内存空间,就要用到malloc()函数.因为malloc只管分配内存空间,并不能对分配的 ...

  9. malloc,calloc,realloc

    与堆操作相关的两个函数 malloc #include<stdio.h> #include<stdlib.h> #include<string.h>int main ...

最新文章

  1. 使用RNN神经网络自动生成名字 (不使用深度学习框架,源码)
  2. 【基础】ABAP不同变量类型之间数值大小比较
  3. 分布式系统——zabbix监控tomcat
  4. boost::statechart模块测量 BitMachine 的事件处理性能的测试程序
  5. linux之tr命令使用和总结
  6. windows下eclipse模拟运行apk
  7. 软件行业选择大公司还是小公司
  8. Oracle EBS学习网站列表
  9. 从王者荣耀看设计模式(四.简单工厂模式)
  10. win32 sdk绘制ListBox控件
  11. 拓端tecdat|R语言量化交易RSI策略:使用支持向量机SVM
  12. 寻找关键之年的榜样和标准
  13. Keepalived高可用(原理、安装、启动、单实例配置、双实例双主配置实战篇)
  14. python 数据分析与挖局书籍
  15. 饿了么ui 下拉框远程搜索 绑定清空原始数据
  16. 2022Java微服务最全面试题集
  17. Ubuntu下录制gif动图
  18. ArcGIS操作系列5 - Arcmap 裁剪 矢量和栅格数据
  19. 【分享】常用JS(2)
  20. (附源码)spring boot社区养老医疗服务平台 毕业设计 041148

热门文章

  1. 一位校长写给大学学生的一封信
  2. 一个小偷写给失主的信
  3. python 如何调用另一个路径下py文件的函数
  4. 古老的 vscode 下载地址
  5. Ubuntu 12.04下安装搜狗拼音 + 安装搜狗皮肤-转
  6. 2009-07-03 19:48 在linux中如何获得微秒精度的时间?-转
  7. [Python] L1-003. 个位数统计-PAT团体程序设计天梯赛GPLT
  8. google lab 深度学习_吴恩达、李飞飞等化身超级英雄!深度学习漫画第一卷现已开源...
  9. Perl用LWP实现GET/POST数据发送 原
  10. 查看js 执行效率工具