使用malloc分配内存时内存布局的混乱

问题描述 投票:0回答:1
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
struct data {
   char name[64];
};
struct fp {
   int (*fp)();
};
void winner()
{
   printf("level passed\n");
}
void nowinner(){
   printf("level has not been passed\n");
}

int main(int argc, char **argv)
{
   struct data *d;  struct fp *f;
   d = malloc(sizeof(struct data));
   f = malloc(sizeof(struct fp));
   int* new_p = malloc(sizeof(int));
   int* new_p2 = malloc(sizeof(int));
   f->fp = nowinner;
   printf("data is at %p, fp is at %p\n", d, f);
   strcpy(d->name, argv[1]);
   f->fp();
}

为什么f指针和p指针的地址相差80字节,而f指针和new_p指针的地址相差32字节?同样,两个 int* 指针之间的差异也导致 32 个字节。这表明,当使用 malloc 分配内存时,实际使用了 80 个字节,这是对内存的严重浪费。另外,用malloc分配int也占用了惊人的32字节。这不会导致大量内存碎片吗?

我的海湾合作委员会: 海湾合作委员会——版本 gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609 版权所有 (C) 2015 自由软件基金会, Inc. when I am debugging

我最初是在检查 f p 指针的内存地址时发现这个问题的。 f p 指针之间有 16 字节的间隙。我考虑了结构体内存对齐的原理,但进一步思考,似乎不可能,因为名称数组占用64字节,无论如何计算,它都应该正确对齐。所以,我尝试mallocing一个int,发现mallocing一个int竟然占用了32个字节,而且它们之间有28个字节的间隙?这不会导致大量的内存碎片吗?

c memory malloc
1个回答
0
投票
  1. 分配的每个块都有一个“隐藏”标头(位于位置之前) 指出)帮助系统将内存返回到可用状态 空间。
  2. 可以分配额外的空间来减少碎片(很多 可用块很小,这可能会阻碍分配能力 大块。)
  3. 可以保留额外的空间以适应数据对齐 机器架构所需。
© www.soinside.com 2019 - 2024. All rights reserved.