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