关于malloc(0)遇到的一个小问题

学习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个字节,字节被覆盖的截图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值