免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 18627 | 回复: 15
打印 上一主题 下一主题

如何知道指针指向的内存的大小 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-06 18:07 |只看该作者 |倒序浏览
本帖最后由 add358 于 2012-04-01 10:55 编辑

  今天在看内存管理部分,突然间想到一个问题:如何知道指针指向的内存大小的问题?
  一般情况下,我们为指针分配内存都是事先知道要分配的内存大小;
  但是假设有另一种情况,当一个指针已经被分配好内存了,
  但是不知道先前分配的内存大小,那么如何知道该指针指向的内存大小呢?

  例子:  
char *p = NULL;
p = (char *)malloc( rand()%1000 );
(注:虽然现实中几乎找不到这种代码,呵呵,但在这里就钻下牛角尖吧)
那么,我要怎样知道分配给指针p的内存大小呢?

以下是个人一点小思路:
直接通过指针p去获取它指向的内存大小,看起来应该是不可能的。
我想我们应该从malloc函数入手,当我们调用malloc分配内存时,该
块内存想必会在内核中记录,那么要怎样通过访问内核来找到这一块内存呢?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2012-03-06 23:02 |只看该作者
vc有个_msize函数

论坛徽章:
0
3 [报告]
发表于 2012-03-07 08:15 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [报告]
发表于 2012-03-07 08:20 |只看该作者
malloc_usable_size

论坛徽章:
0
5 [报告]
发表于 2012-03-07 09:28 |只看该作者
本帖最后由 add358 于 2012-03-07 09:32 编辑
bruceteen 发表于 2012-03-07 08:20
malloc_usable_size


问题: p  = (char *)malloc(16);
         len = malloc_usable_size(p);
        /*  为什么在这里输出不是16,而是20?
         *  那么,是"malloc“函数多分配了一些内存,
         *  还是"malloc_usable_size"计算偏大了?
         */
        printf(" len = %d\n",len);

        free(p);
        len = malloc_usable_size(p);
        /*  这里输出的还是20?
         *  ”free"之后,应该释放掉内存,
         *  所以这里输出0才对?
         */
        printf(" len = %d\n",len);

       /* 编译器使用的是 gcc 4.3.0,然后可以的话,
        * 能说说"malloc_unsable_size"的实现原理?
        */

论坛徽章:
0
6 [报告]
发表于 2012-03-07 09:41 |只看该作者
malloc_usable_size() returns the number of bytes available in the dynamically allocated buffer ptr, which may be
       greater than the requested size (but is guaranteed to be at least as large,  if  the  request  was  successful).
       Typically, you should store the requested allocation size rather than use this function.

这个函数返回值指的是当前指针可用以分配的内存大小,而不是等于已经分配的大小。
所以手册也说明不要用这个函数来完成你上边要求的工作,

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
7 [报告]
发表于 2012-03-07 11:24 |只看该作者
回复 5# add358


    malloc(16); 的含义是你要求分配16字节,而平台只要分配一个不小于16字节的空间就行了,所以 malloc_usable_size 大于等于 malloc

打个比方吧,你老婆身上都是一叠一叠的百元大钞,你乞求你老婆给你60元买包烟,你老婆掏了一张百元大钞给你,然后你问你老婆:“刚才你给了多少钱给我呀?”,你老婆当然是回答“100元”,而不是“60元”

论坛徽章:
0
8 [报告]
发表于 2012-03-07 13:17 |只看该作者
我想问free的过程是什么?

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
9 [报告]
发表于 2012-03-07 15:36 |只看该作者
你应该P = NULL, free后,这个指针的任何东西都不应该做为参考......

论坛徽章:
0
10 [报告]
发表于 2012-03-07 21:01 |只看该作者
我的系统没有malloc_usable_size 是怎么回事啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP