免费注册 查看新帖 |

Chinaunix

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

[C] 奇怪的malloc()! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-23 15:24 |只看该作者 |倒序浏览
本帖最后由 zhuqing_739 于 2010-08-23 15:30 编辑

众所周知,malloc()是在堆空间分配内存的,麻烦大家来看一段代码:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. typedef struct student
  5. {
  6.         char name[11];
  7.         float score;
  8.         struct student *node;

  9. }STUDENT;

  10. int main(int argc, char *argv[])
  11. {
  12.        
  13.                STUDENT *p1, *p2, *p3;

  14.         printf("the size of STUDENT is %d\n",sizeof(STUDENT));

  15.         p1 = (STUDENT *)malloc(sizeof(STUDENT));
  16.         if (NULL == p1)
  17.         {
  18.                 printf("malloc error");
  19.                 return 1;
  20.         }
  21.                 printf("the address is %p\n",p1);

  22.         p2 = (STUDENT *)malloc(sizeof(STUDENT));
  23.         if (NULL == p2)
  24.         {
  25.                 printf("malloc error");
  26.                 return 1;
  27.         }
  28.         printf("the address is %p\n",p2);

  29.         p3 = (STUDENT *)malloc(sizeof(STUDENT));
  30.         if (NULL == p3)
  31.         {
  32.                 printf("malloc error");
  33.                 return 1;
  34.         }
  35.                 printf("the address is %p\n",p3);

  36.         free(p1);
  37.         p1 = NULL;
  38.         free(p2);
  39.         p2= NULL;
  40.         free(p3);
  41.         p3 = NULL;
  42.        
  43.    
  44.         return 0;
  45. }
复制代码
再来看一下输出结果:

the size of STUDENT is 20
the address is 0x804a008
the address is 0x804a020
the address is 0x804a038

请问:很明显,既然STUDENT的大小为20个字节,那为什么malloc()分配的空间会是24(0x804a020 - 0x804a008 = 0x804a038 - 0x804a020 = 24)个字节呢?
ps: 上述程序是在Linux下运行的!
谢谢!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2010-08-23 15:26 |只看该作者
分配的内存地址会对齐,很可能多给些

论坛徽章:
0
3 [报告]
发表于 2010-08-23 15:29 |只看该作者
20个字节,20已经是4的倍数了,已经对齐了啊!?

论坛徽章:
0
4 [报告]
发表于 2010-08-23 15:30 |只看该作者
本帖最后由 zhangsuozhu 于 2010-08-23 15:36 编辑

我猜有二种可能。一种是malloc分配时是4K分页对齐的。第二种可能malloc在分配内存时加了些自已的信息在里面。

同楼主求甚解!

论坛徽章:
0
5 [报告]
发表于 2010-08-23 15:32 |只看该作者
难道多出来的4个字节就是传说中的“内存碎片”吗?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2010-08-23 15:38 |只看该作者
20个字节,20已经是4的倍数了,已经对齐了啊!?
zhuqing_739 发表于 2010-08-23 15:29



    可能是按8字节对齐的

论坛徽章:
0
7 [报告]
发表于 2010-08-23 15:42 |只看该作者
可能是按8字节对齐的
hellioncu 发表于 2010-08-23 15:38



    不对啊!如果是按8个字节对齐的话,第一个printf()输出结果就不是20了!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2010-08-23 15:44 |只看该作者
不对啊!如果是按8个字节对齐的话,第一个printf()输出结果就不是20了!
zhuqing_739 发表于 2010-08-23 15:42



    不是说你的结构,是说malloc分配的内存地址

论坛徽章:
0
9 [报告]
发表于 2010-08-23 15:59 |只看该作者
SGI的malloc自己也需要保存一些信息在内存里面。应该是这些信息占用了空间,我看看malloc源码

论坛徽章:
0
10 [报告]
发表于 2010-08-23 16:00 |只看该作者
本帖最后由 zhuqing_739 于 2010-08-23 16:02 编辑
不是说你的结构,是说malloc分配的内存地址
hellioncu 发表于 2010-08-23 15:44



    看下面这段改过的程序就知道不是按8对齐的了!
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. typedef struct student
  5. {
  6.         char name[11];
  7.         float score;
  8.         struct student *node;

  9. }STUDENT;

  10. int main(int argc, char *argv[])
  11. {
  12.        
  13.     STUDENT *p1, *p2, *p3;

  14.         printf("the size of STUDENT is %d\n",sizeof(STUDENT));

  15.         p1 = (STUDENT *)malloc([size=5]4[/size]);
  16.         if (NULL == p1)
  17.         {
  18.                 printf("malloc error");
  19.                 return 1;
  20.         }
  21.     printf("the address is %p\n",p1);

  22.         p2 = (STUDENT *)malloc([size=5]4[/size]);
  23.         if (NULL == p2)
  24.         {
  25.                 printf("malloc error");
  26.                 return 1;
  27.         }
  28.         printf("the address is %p\n",p2);

  29.         p3 = (STUDENT *)malloc([size=5]4[/size]);
  30.         if (NULL == p3)
  31.         {
  32.                 printf("malloc error");
  33.                 return 1;
  34.         }
  35.     printf("the address is %p\n",p3);

  36.         free(p1);
  37.         p1 = NULL;
  38.         free(p2);
  39.         p2 = NULL;
  40.         free(p3);
  41.         p3 = NULL;
  42.        
  43.    
  44.         return 0;
  45. }
复制代码
看一下输出结果:
the size of STUDENT is 20
the address is 0x804a008
the address is 0x804a018
the address is 0x804a028
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP