malloc(0)的问题

栈是由编译器自动分配释放
堆由程序猿手动分配释放,如不释放最后可能由操作系统自动回收。比如用malloc分配的空间就在堆上。

这是一个前辈写的,非常详细

//main.cpp 
int a = 0; 全局初始化区 
char *p1; 全局未初始化区 
main() 
{ 
int b; 栈 
char s[] = "abc"; 栈 
char *p2; 栈 
char *p3 = "123456"; 123456\0在常量区,p3在栈上。 
static int c =0; 全局(静态)初始化区 
p1 = (char *)malloc(10); 
p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。 
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"
优化成一个地方。 
} 

那么在下面这段程序

ptr = (char *)malloc(0)   /*顺便一提,在以前malloc函数返回的是char型指针,新的ANSIC规定返回值为void类型,所以如果需要赋值,要在malloc前加强制类型转换,如本题的char* 。*/
char   *ptr;
if ((ptr = (char  *)malloc(0)) ==NULL)   
     puts( "Got   a   null   pointer "); 
else 
     puts( "Got   a   valid   pointer "); 

输出结果为Got a valid pointer。
问题来了:指针为NULL时指向哪里?分配的空间为0时(即malloc(0))又指向哪里?
当使用malloc后,只有在没有足够内存的情况下会返回NULL,或是出现异常报告。
malloc(0):系统就已经帮你准备好了堆中的使用起始地址(不会为NULL)。但是你不能对该地址进行写操作(不是不允许),如果写了话,当调用free(ptr)就会产生异常报告(地址受损)。
这里还有一个描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值