请教一个问题,malloc在64 bits linux下,malloc(504)后为什么分配到chunk的size字段是512,而不是520?

feekee 2017-12-31 04:24:26
代码如下:
[root@bogon heap]# cat heap.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *a[2010];
int i=2000;
void Malloc(void);
void Free(void);
void Edit(void);
void Print(void);
 
int main(void)
{
        char c;
        setbuf(stdout,NULL);
        while (1)
        {
                printf("What is you choose?\n");
                scanf("%c",&c);
                getchar();
                if(c == 'm')
                {
                        Malloc();
                }
                else if(c == 'f')
                {
                        Free();
                }
                else if(c == 'e')
                {
                        Edit();
                }
                else if(c == 'p')
                {
                        Print();
                }
                else
                {
                        break;
                }
        }
        printf("end\n");
}
 
void Malloc(void)
{
        int q;
        printf("malloc\n");
 
        printf("enter the size of chunk\n");
        scanf("%d",&q);
        getchar();
 
        //i=2000 a[2010]
        a[i] = (char *)malloc(q);
        printf("enter you code\n");
        gets(a[i]);
        i++;
        printf("OK!\n\n");
}
 
void Free(void)
{
        int j;
        //printf("now i free a heap\n");
        printf("free?\n");
 
        scanf("%d",&j);
        getchar();
 
        free(a[j+2000]);
        printf("Ok!\n\n");
}
 
void Edit(void)
{
        int j;
        printf("edit?\n");
        scanf("%d",&j);
        getchar();
        gets(a[j+2000]);
        printf("Ok!\n\n");
}
 
void Print(void)
{
        int j;
        printf("show?\n");
        scanf("%d",&j);
        getchar();
        printf("%s\n",a[j+2000]);
        printf("end\n\n");
}

很简单的堆申请操作,之后用gdb查看了一下堆得大小:
[root@bogon heap]# gdb -q ./heap
Reading symbols from ./heap...done.
(gdb) list
1       #include <stdio.h>
2       #include <stdlib.h>
3       #include <string.h>
4       char *a[2010];
5       int i=2000;
6       void Malloc(void);
7       void Free(void);
8       void Edit(void);
9       void Print(void);
10
(gdb) list
11      int main(void)
12      {
13              char c;
14              setbuf(stdout,NULL);
15              while (1)
16              {
17                      printf("What is you choose?\n");
18                      scanf("%c",&c);
19                      getchar();
20                      if(c == 'm')
(gdb) b 17
Breakpoint 1 at 0x400772: file heap.c, line 17.
(gdb) r
Starting program: /home/songkun/ctf_kanxue/heap/heap
 
Breakpoint 1, main () at heap.c:17
17                      printf("What is you choose?\n");
(gdb) c
Continuing.
What is you choose?
m
malloc
enter the size of chunk
504
enter you code
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
OK!
 
 
Breakpoint 1, main () at heap.c:17
17                      printf("What is you choose?\n");
(gdb) p a[2000]
$1 = 0x605010 'A' <repeats 200 times>...
(gdb) x/48x 0x605000
0x605000:       0x00000000      0x00000000      0x00000201      0x00000000
0x605010:       0x41414141      0x41414141      0x41414141      0x41414141
0x605020:       0x41414141      0x41414141      0x41414141      0x41414141
0x605030:       0x41414141      0x41414141      0x41414141      0x41414141
0x605040:       0x41414141      0x41414141      0x41414141      0x41414141
0x605050:       0x41414141      0x41414141      0x41414141      0x41414141
0x605060:       0x41414141      0x41414141      0x41414141      0x41414141
0x605070:       0x41414141      0x41414141      0x41414141      0x41414141
0x605080:       0x41414141      0x41414141      0x41414141      0x41414141
0x605090:       0x41414141      0x41414141      0x41414141      0x41414141
0x6050a0:       0x41414141      0x41414141      0x41414141      0x41414141
0x6050b0:       0x41414141      0x41414141      0x41414141      0x41414141
(gdb) x/128x 0x605010
0x605010:       0x41414141      0x41414141      0x41414141      0x41414141
0x605020:       0x41414141      0x41414141      0x41414141      0x41414141
0x605030:       0x41414141      0x41414141      0x41414141      0x41414141
0x605040:       0x41414141      0x41414141      0x41414141      0x41414141
0x605050:       0x41414141      0x41414141      0x41414141      0x41414141
0x605060:       0x41414141      0x41414141      0x41414141      0x41414141
0x605070:       0x41414141      0x41414141      0x41414141      0x41414141
0x605080:       0x41414141      0x41414141      0x41414141      0x41414141
0x605090:       0x41414141      0x41414141      0x41414141      0x41414141
0x6050a0:       0x41414141      0x41414141      0x41414141      0x41414141
0x6050b0:       0x41414141      0x41414141      0x41414141      0x41414141
0x6050c0:       0x41414141      0x41414141      0x41414141      0x41414141
0x6050d0:       0x41414141      0x41414141      0x41414141      0x41414141
0x6050e0:       0x41414141      0x41414141      0x41414141      0x41414141
0x6050f0:       0x41414141      0x41414141      0x41414141      0x41414141
0x605100:       0x41414141      0x41414141      0x41414141      0x41414141
0x605110:       0x41414141      0x41414141      0x41414141      0x41414141
0x605120:       0x41414141      0x41414141      0x41414141      0x41414141
0x605130:       0x41414141      0x41414141      0x41414141      0x41414141
0x605140:       0x41414141      0x41414141      0x41414141      0x41414141
0x605150:       0x41414141      0x41414141      0x41414141      0x41414141
0x605160:       0x41414141      0x41414141      0x41414141      0x41414141
0x605170:       0x41414141      0x41414141      0x41414141      0x41414141
0x605180:       0x41414141      0x41414141      0x41414141      0x41414141
0x605190:       0x41414141      0x41414141      0x41414141      0x41414141
0x6051a0:       0x41414141      0x41414141      0x41414141      0x41414141
0x6051b0:       0x41414141      0x41414141      0x41414141      0x41414141
0x6051c0:       0x41414141      0x41414141      0x41414141      0x41414141
0x6051d0:       0x41414141      0x41414141      0x41414141      0x41414141
0x6051e0:       0x41414141      0x41414141      0x41414141      0x41414141
0x6051f0:       0x41414141      0x41414141      0x41414141      0x41414141
0x605200:       0x41414141      0x41414141      0x00020e00      0x00000000

根据chunk的结构,size字段是0x201,就是512字节。
但是我计算的是,申请字节504+(pre_size字段大小)8+(size字段大小)8=520。哪位大哥可以讲一下,为什么是gdb看到的是512 bytes而不是520 bytes呢?
...全文
397 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
feekee 2018-01-12
  • 打赏
  • 举报
回复
引用 3 楼 SXJIAKE 的回复:
确认用的不是 32 位编译器而是 64 位?另外,这个没有什么规定说额外的大小就一定是多少,具体还是看看 glibc 里面 malloc 是如何实现的。
是64位的
feekee 2018-01-12
  • 打赏
  • 举报
回复
多谢,因为size字段是0x201,说明前一个chunk非空闲,所以pre_size字段的8字节被征用了,多谢
自信男孩 2018-01-11
  • 打赏
  • 举报
回复
除了申请到的对空间之外,内存管理还会分配额外的空间,用于管理申请的空间;比如申请504个堆上空间,那么内存其实申请的比504要大,其他的部分内存主要是用于存储管理已经申请的空间信息。
xuhaoee 2018-01-11
  • 打赏
  • 举报
回复
malloc实际分配的内存要比你申请的大,因为需要用它们来保存一些信息,最典型的是保存这块内存的大小,这样在你free的时候,才能释放正确大小的内存。
「已注销」 2018-01-10
  • 打赏
  • 举报
回复
确认用的不是 32 位编译器而是 64 位?另外,这个没有什么规定说额外的大小就一定是多少,具体还是看看 glibc 里面 malloc 是如何实现的。
赵4老师 2018-01-03
  • 打赏
  • 举报
回复
参考Linux中malloc相关源代码。
paschen 2017-12-31
  • 打赏
  • 举报
回复
malloc分配的内在会比实际申请的大,用于记录必要的数据,具体分配多少取决于编译器对函数的实现方式

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧