1

我在动态内存分配方面遇到了麻烦。不知何故,我的结构的实际大小(所有部分的总和)小于类型本身的大小。这是代码:

#include <stdio.h>
#include <malloc.h>

struct Lol {
    int a;
    char b;

    char s[20];
};

void main() {

    Lol* lol = (Lol*)malloc(sizeof(Lol));

    printf("Type size: %d bytes\n", sizeof(Lol));
    printf("Actual struct size: %d bytes\n", sizeof(lol -> a) + sizeof(lol -> b) + sizeof(lol -> s));

 }

在这种情况下,结构大小应该是 25 个字节(4 个字节用于 int,1 个字节用于 char,20 个字节用于 char 数组),但 sizeof(Lol) 出于某种原因显示为 28,因为 char 类型将被视为 int 类型。这一切是怎么回事?这是否意味着我什么都没有丢失 3 个字节?

4

1 回答 1

1

我的结构的实际大小(所有部分的总和)小于类型本身的大小”

由于许多计算机操作在它们处理的值在某些内存边界对齐时会更快,因此 C 语言标准允许实现进行这种对齐。在大多数系统上,int 将在 4 或 8 字节边界上对齐,具体取决于 int 的大小。结构的大小必须对齐,以便数组中下一个结构的地址正确对齐,因此以 int 开头的结构必须与 4 字节边界对齐,其大小必须是 4 的倍数。

这是否意味着我什么都没有丢失 3 个字节?

是的。(好吧,这并不是什么都没有……您的程序通常会因此而更快。)现代机器支持高达 2 TB 的 RAM,这比以前更不用担心了。

于 2013-05-18T07:44:03.590 回答