首页
社区
课程
招聘
[求助][已解决]问一个新问题,malloc在64 bits linux下,malloc(504)后为什么分配到chunk的size字段是512,而不是520?
发表于: 2017-12-31 12:10 4409

[求助][已解决]问一个新问题,malloc在64 bits linux下,malloc(504)后为什么分配到chunk的size字段是512,而不是520?

2017-12-31 12:10
4409

如图所示。

[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呢?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 60
活跃值: (314)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
2
64bit下能整除8但不能整除16的chunk会把下一个chunk的prev  size当成自己存放资料的空间。原本prev  size就是前一个chunk被free掉才有用到,那前一个chunk在使用中代表prev  size这时候是没有作用的,所以可以节省空间拿后一个chunk的prev  size来存放

这种特性只有64bit才有,32bit的好像没有
2018-1-1 12:23
0
雪    币: 822
活跃值: (290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢
2018-1-6 20:47
0
雪    币: 822
活跃值: (290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
弄明白了,还是基础不好呀,这么简单的问题
2018-1-12 15:33
0
游客
登录 | 注册 方可回帖
返回
//