
C语言结构体内存占用详解
sizeof 运算符可以获取C语言中结构体的大小。然而,结构体实际占用的字节数不仅取决于成员变量的总大小,还受到编译器内存对齐策略的影响。
让我们来看一个例子:
#includeint main() { struct date { int year; int month; int day; }; struct person { char name[10]; char sex; struct date birthday; char address[10]; long zipcode; }; size_t size = sizeof(struct person); printf("struct person size: %zu bytes\n", size); return 0; }
该代码定义了person 结构体,包含多个成员变量:
立即学习“C语言免费学习笔记(深入)”;
-
name(字符数组,10字节) -
sex(字符型,1字节) -
birthday(嵌套的date结构体,通常为12字节,三个int成员各占4字节) -
address(字符数组,10字节) -
zipcode(长整型,通常为8字节)
简单相加,成员变量总大小为 41字节 (10 + 1 + 12 + 10 + 8 = 41)。 然而,实际大小通常大于此值,因为编译器会为了提高内存访问效率而进行内存对齐。
对齐规则通常与编译器和目标平台相关,但通常是4字节或8字节对齐。 这意味着每个成员的地址必须是其大小的倍数。 如果编译器使用4字节对齐,person 结构体的大小可能会被填充到4字节的倍数,导致最终大小大于41字节。 例如,name 可能会占用12字节(为了4字节对齐),sex 可能会占用4字节,以此类推。 最终大小可能为48字节。
总结:
结构体的大小取决于成员变量的大小和编译器的内存对齐策略。 sizeof 运算符给出的是编译器最终确定的结构体大小,这可能大于成员变量大小的简单累加。 要精确计算大小,需要了解编译器的具体对齐规则。 不同的编译器和平台可能产生不同的结果。










