我遇到动态内存分配问题。 不知何故,我的struct的实际大小(所有部分的总和)小于类型本身的大小。这是代码:
#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));
}
在这种情况下,struct size应该是25个字节(int为4个字节,char为1个字节,char数组为20个字节),但sizeof(Lol)由于某种原因显示28,因为char类型将被视为int类型。这一切是怎么回事?这是否意味着我什么都没丢失3个字节?
答案 0 :(得分:1)
我的struct的实际大小(所有部分的总和)小于类型本身的大小“
因为许多计算机操作在它们处理的值在某些内存边界上对齐时更快,所以C语言标准允许实现进行这样的对齐。在大多数系统中,int将在4或8字节边界上对齐,具体取决于int的大小。必须对齐结构的大小,以便数组中下一个结构的地址正确对齐,因此以与4字节边界对齐的int开头的结构必须具有4的倍数。
这是否意味着我什么都没丢失3个字节?
是。 (嗯,它并不是什么都没有......因为它,你的程序通常会更快。)现代机器支持高达2TB的RAM,这不像以前那么令人担忧。