-
-
[求助][已解决]问一个新问题,malloc在64 bits linux下,malloc(504)后为什么分配到chunk的size字段是512,而不是520?
-
发表于:
2017-12-31 12:10
4408
-
[求助][已解决]问一个新问题,malloc在64 bits linux下,malloc(504)后为什么分配到chunk的size字段是512,而不是520?
如图所示。
[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呢?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!