博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
malloc(0)的返回值
阅读量:7234 次
发布时间:2019-06-29

本文共 842 字,大约阅读时间需要 2 分钟。

hot3.png

很多嵌入式c面试,会问到这个问题,我也就百度了下,集合几位网友的分析,记录下来,便于我自己随时查看

当malloc分配内存时它除了分配我们指定SIZE的内存块,还会分配额外的内存来存储我们的内存块信息,用于维护该内存块。因此,malloc(0)返回一个合法的指针并指向存储内存块信息的额外内存,我们当然可以在该内存上进行读写操作,但是这样做了会破坏该内存块的维护信息,因此当我们调用free(ptr)时就会出现错误

ptr = malloc(0*sizeof(char)) ;

ptr是局部指针变量,存储在栈中,它的值是动态分配的一块堆中的空间的首地址
所以说这个地址是合法的,但是由于malloc的大小是0,故这个这个地址指向的堆中的存储空间的大小是0,
这个指针类似于一个野指针,可以使用的,但是是有风险的,因为不知道这个指针后面的内存空间被谁使用着,要是被核心进程使用,哪肯定会造成相应程序的崩溃
关于加上free后,程序会崩溃,我理解是由于在堆中并没有对应的空间分配到导致的~

#include <stdio.h>

#include <stdlib.h>
#include <string.h>

int main()

{
 char *ptr ;
 ptr = malloc(0*sizeof(char)) ;
 
 if (NULL == ptr)
  printf("got a NULL pointer/n");
 else 
 {
  printf("got a Valid pointer/n");
  
  strcpy(ptr,"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); 
 
  printf("the string at %p is :%s/n",ptr, ptr);
 // free(ptr);
 }
 return 0 ;
}

 

转载于:https://my.oschina.net/u/920274/blog/1838312

你可能感兴趣的文章
翻译连载 | 附录 A:Transducing(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...
查看>>
一篇文章让你明白运维发展方向
查看>>
iOS问题整理03----Category
查看>>
Redis入门第七篇【对key的操作】
查看>>
[译] 避免 Swift 单元测试中的强制解析
查看>>
从 JDK 源码角度看线程的阻塞和唤醒
查看>>
申请掘金专栏
查看>>
要做软件工程师,而不是前端工程师
查看>>
金三银四,你可以行动了
查看>>
轻松入门机器学习之概念总结(二)
查看>>
IDAPython 让你的生活更滋润 – Part 3 and Part 4
查看>>
AJAX请求真的不安全么?谈谈Web安全与AJAX的关系。
查看>>
搭建VUE开发环境
查看>>
Android Handler机制之内存泄漏
查看>>
Android 身高体重曲线的实现
查看>>
从Fresco源码中找到非侵入式的答案
查看>>
GitHub官方的入门教程(中字) && 非官方 GitNote
查看>>
DialogFragment源码分析
查看>>
WebView基本用法
查看>>
预告 | ArcBlock 开发者受邀在 Code BEAM SF 大会演讲
查看>>