C 类型大小和内存分配

C 类型大小和内存分配,c,memory,malloc,memory-leaks,sizeof,C,Memory,Malloc,Memory Leaks,Sizeof,我在动态内存分配方面遇到了问题。 不知何故,我的结构的实际大小(所有部分的总和)小于类型本身的大小。代码如下: #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 b

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

#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));

 }
#包括
#包括
结构Lol{
INTA;
字符b;
chars[20];
};
void main(){
Lol*Lol=(Lol*)malloc(sizeof(Lol));
printf(“类型大小:%d字节\n”,大小为(Lol));
printf(“实际结构大小:%d字节\n”,sizeof(lol->a)+sizeof(lol->b)+sizeof(lol->s));
}
在这种情况下,struct size应该是25个字节(int为4个字节,char为1个字节,char数组为20个字节),但由于某种原因,sizeof(Lol)显示为28,因为char类型将被视为int类型。这是怎么回事?这是否意味着我没有丢失3个字节

my struct的实际大小(所有部分的总和)小于类型本身的大小“

由于许多计算机操作在特定内存边界上对齐时速度更快,C语言标准允许实现这种对齐。在大多数系统上,int将在4字节或8字节边界上对齐,具体取决于int的大小。结构的大小必须对齐,以便t的地址数组中的下一个结构将正确对齐,因此以int开头并对齐到4字节边界的结构的大小必须是4的倍数

这是否意味着我没有丢失3个字节

是的。(嗯,这并不是什么都没有……因为它,你的程序通常会更快。)随着现代机器支持高达2 TB的RAM,这已经不像以前那么令人担忧了

my struct的实际大小(所有部分的总和)小于类型本身的大小“

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

这是否意味着我没有丢失3个字节

对。(好吧,这并不是什么都没有……因为它,你的程序通常会更快。)随着现代机器支持高达2 TB的RAM,这已经不像以前那么令人担忧了