学习malloc的时候,我尝试创建一个字符指针,只分配1字节空间malloc(1)给他,再创建另一个字符指针也分配1字节空间给他,为了证明只分配了1字节,进行了以下实验:
#include "stdio.h"
#include <stdlib.h>
#include <string.h>
int main()
{
char *p=NULL; char *q=NULL;
p = (char *)malloc(1); q = (char *)malloc(1);
strcpy(q, "abandon");
strcpy(p, "gfedcba");
printf("&p=%p-%p-%s\n", &p, p, p);
printf("&q=%p-%p-%s\n", &q, q, q);
printf("&p+0=%p-%p-%c \t", &p+0, p+0, *(p+0)); printf("&p+1=%p-%p-%c\n", &p+1, p+1, *(p+1));
printf("&p+2=%p-%p-%c \t", &p+2, p+2, *(p+2)); printf("&p+3=%p-%p-%c\n", &p+3, p+3, *(p+3));
printf("&p+4=%p-%p-%c \t", &p+4, p+4, *(p+4)); printf("&p+5=%p-%p-%c\n", &p+5, p+5, *(p+5));
printf("&p+6=%p-%p-%c \t", &p+6, p+6, *(p+6)); printf("&p+7=%p-%p-%c\n", &p+7, p+7, *(p+7));
printf("&q+0=%p-%p-%c \t", &q+0, q+0, *(q+0)); printf("&q+1=%p-%p-%c\n", &q+1, q+1, *(q+1));
printf("&q+2=%p-%p-%c \t", &q+2, q+2, *(q+2)); printf("&q+3=%p-%p-%c\n", &q+3, q+3, *(q+3));
printf("&q+4=%p-%p-%c \t", &q+4, q+4, *(q+4)); printf("&q+5=%p-%p-%c\n", &q+5, q+5, *(q+5));
printf("&q+6=%p-%p-%c \t", &q+6, q+6, *(q+6)); printf("&q+7=%p-%p-%c\n", &q+7, q+7, *(q+7));
free(p+8); free(q+8);
return 0;
}
以下是打印结果:
&p=000000000061FE18-0000000000A72460-gfedcba
&q=000000000061FE10-0000000000A72480-abandon
&p+0=000000000061FE18-0000000000A72460-g &p+1=000000000061FE20-0000000000A72461-f
&p+2=000000000061FE28-0000000000A72462-e &p+3=000000000061FE30-0000000000A72463-d
&p+4=000000000061FE38-0000000000A72464-c &p+5=000000000061FE40-0000000000A72465-b
&p+6=000000000061FE48-0000000000A72466-a &p+7=000000000061FE50-0000000000A72467-
&q+0=000000000061FE10-0000000000A72480-a &q+1=000000000061FE18-0000000000A72481-b
&q+2=000000000061FE20-0000000000A72482-a &q+3=000000000061FE28-0000000000A72483-n
&q+4=000000000061FE30-0000000000A72484-d &q+5=000000000061FE38-0000000000A72485-o
&q+6=000000000061FE40-0000000000A72486-n &q+7=000000000061FE48-0000000000A72487-
实验证明:malloc(1)不止分配了1个字节空间,而是分配了
0000000000A72480-0000000000A72460=0000000000000020 也就是32个字节空间
然后我又尝试了malloc(0),malloc(0x2)一直加到malloc(0x18)都是分配了0x20(32)个字节空间,
malloc(0x19)到malloc(0x28)则是分配了0x30(48)个字节空间,
malloc(0x29)到malloc(0x38)则是分配了0x40(64)个字节空间
以此类推,我得出结论
malloc(0x00)-malloc(0x18) 预留0x20个空间
malloc(0x19)-malloc(0x28) 预留0x30个空间
malloc(0x29)-malloc(0x38) 预留0x40个空间
malloc(0x39)-malloc(0x48) 预留0x50个空间
... ...
然后是关于&p和&q地址的补充:
&p(000000000061FE18)-&q(000000000061FE10)=8个字节
00 00 00 00 00 61 FE 10
1 2 3 4 5 6 7 8
刚好是8个字节
至于为什么打印&p+0,&p+1,&p+2...是因为我一开始以为字符存放在&p+0,&p+1,&p+2...里,所以打印出来作比较。
最后补一个malloc(24)相当于malloc(0x18)预留了0x20,32个字节空间但是存储了36个字节,字节被覆盖的截图
![](https://img-blog.csdnimg.cn/img_convert/1cf236e3cecb52d8be0107bb980ad753.png)