动态内存分配到底为谁分配内存空间

为了动态的管理宝贵的内存,许多程序中要使用到动态内存分配。一般情况下,在c语言中,使用malloc()函数来分配指定大小的内存空间,用free()函数来释放这块内存空间。但是,往往初学者在编写这类程序时会出错,而许多错误是因为到底为谁分配了这块内存不清楚导致的。来看下面一段程序:
#include <stdio.h>
#include <malloc.h>

void main()
{
 int i=100;
 int* p;
 p=(int*)malloc(sizeof(int));
 if(p==NULL)
 {
  printf("内存分配不成功");
 }
 else
 {
  p=&i;
  printf("i=%d/n",i);
  printf("p=%d/n",*p);
  free(p);
  p=NULL;
 }
}
这段程序在编译和连接时都不会出错,并且也能在运行时产生正确的结果,但是,编译器会报出内存错误。这是为什么呢?
这段程序虽然严格遵从了malloc()函数和free()函数的使用规则,按照编写者的意向,它是不会产生内存错误的,但是确实出现了内存错误,其根本原因就在于编写者没有明白分配的这块内存分配给了谁!
编写者可能认为,这块内存分配给了指针p,也就是给p分配了一块sizeof(int)大小的内存空间,这恰恰是问题的关键。因为这段程序并不是将sizeof(int)大小的内存空间分配给了p,而是分配给了p指向的那块内存空间。而在上面的程序中,这块内存空间是存放int型的变量i的,而我们知道,int型的变量i是放在栈中的,而栈空间是由编译器来分配的,而不是由程序员来分配的。既然不是由程序员分配的,那么它的释放也就不由程序员来管理,而是由编译器来管理的。这下明白了吧,程序员想管理一块本来不归自己管理的内存空间,肯定会出现内存错误。
我们还是用上一篇日志中的那个幸运的销售员说事,因为他居住的房子是租住房东的。也就是说,他虽然居住在这个房子中,但是这个房子的所有权是归房东所有的,而不是归他所有的。如上面的程序一样,他现在想要卖掉他租住的房子,那肯定是有问题的(好比程序员要释放编译器分配的栈中的内存)。但是房东要卖掉这个房子,却是没有问题的(编译器自己释放自己分配的内存)。
 

 最新作品《C语言参悟之旅》全新上市,敬请关注!
官方网站:
http://www.tqbooks.net/product/gb/product_detail.asp?catalogid=10&productid=1474
China-pub有售:

http://www.china-pub.com/49980

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值