您现在的位置:计算机技术学习网 > 技术中心 > WEB编程 > JSP >

关于free如何知道要释放内存空间的长度问题

来源:未知 责任编辑:责任编辑 发表时间:2015-03-01 01:35 点击:

在学内存分配的问题的时候,malloc和calloc都要指定需要分配内存的大小,但是free的就不需要,我就纳闷free是咋知道从指针地址开始的多少长度是被分配了的?

当时就想,在malloc或者calloc的时候,编译器应该把大小的数值放到哪个地方了,当free的时候就去找那个数值,释放掉数值大小的堆空间。

但是到底放哪呢?

前几天在网上一阵乱逛,说是现代编译器就是把大小的数值放在分配地址开始的之前位置,但是具体在之前多少位置呢?今天在vs的内存监视器里面看到了。

测试代码如下:

[cpp] 
#include "stdlib.h" 
#include "stdio.h" 
 
#define Num 100 
 
int main(void) 

    int i; 
    int *p=(int *)malloc(Num); 
    for (i=0;i<Num;i++) 
    { 
        *(p+i)=1;   //赋值为1只是为了看起来方便 
    } 
    free(p); 
 
    return 0; 

其中p的地址为0x00393220
接着打开vs2008的内存监视器窗口看:


有一个地址为0x00393210的很可疑,因为0x64=100

那么改一下看看:

[cpp] 
#define Num 50 
再看内存监视器:


看到*(0x00393210)=0x32;即0x32=50

那应该就是把大小放这里了,就是说距离分配地址0x10之前的位置。

从中可以看出为什么分配堆更号内存大小(当然它的主要方面还是“碎片”的产生)的一个小方面~~~

那么calloc又是如何呢?答案就是和malloc一样,把原来的size换成num*size;

[cpp]
#include "stdlib.h" 
#include "stdio.h" 
 
#define Num 50 
 
int main(void) 

    int i; 
    int *p=(int *)calloc(Num,Num); 
    for (i=0;i<Num;i++) 
    { 
        *(p+i)=1; 
    } 
    free(p); 
 
    return 0; 

这里的p地址是0x00395008。

0x9c4=2500(这里有大小端的知识,呵呵,可以看出来x86是小端:MSB存高地址)

这对于存放内存空间大小的数值是足够的,因为calloc和malloc的函数原型:

[cpp] 
void *malloc(size_t size); 
void *calloc(size_t num,size_t size); 
ps:size_t在内部被宏定义为unsigned int。

这样岂不是说calloc可以把整个内存都分配了,那当然不行,如何你申请的堆内存空间过大,则会发生以下错误(vs2008):

 

中间那句话很简洁明了吧,至于我输了多大的值,大家可以试试,其实话说在ARM和DSP(针对MCU),堆和栈的大小和起始地址都是可以手动分配的,你当然不能超过了~~~

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • JSP与Servlet
  • 打开一个jsp页面默认查询所有数据,调用action
  • 使用JSP标签库验证用户的输入(2)完
  • 自己动手写MiniBBS系列(基本篇)之用户登录
  • WIN98/2000下的jsp服务器
  • Struts学习傻瓜式入门篇
  • 自定义JSP标签(tag)浅议
  • JSP取当前日期
  • JDBC 入门(一)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索 - 移动版 - 返回顶部
Copyright © 2008-2013 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1