C语言 类型和内存分配的大小



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

#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 bytesn", sizeof(Lol));
    printf("Actual struct size: %d bytesn", sizeof(lol -> a) + sizeof(lol -> b) + sizeof(lol -> s));
 }
在这种情况下

结构体的大小应该是25字节(4字节为int, 1字节为char和20字节为char数组),但sizeof(Lol)显示我28由于某种原因,char类型将被视为int类型。这是怎么回事?这是否意味着我白白损失了3个字节?

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

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

这是否意味着我一无所获地损失了3个字节?

是的。(嗯,也不是完全没有……因此,您的程序通常会更快。)随着现代机器支持高达2tb的RAM,这已经不像以前那么令人担忧了。

相关内容

  • 没有找到相关文章

最新更新