为什么C/C++中sizeof计算自定义结构体大小的结果小于预期?
问题相关示例代码
#include <iostream> typedef struct Node { int key; int ltag, rtag; struct Node* lchild, * rchild; }Node; Node* getNewNode(int key) { Node *p =(Node *)malloc(sizeof(Node)); } int main() { std::cout << "Hello World!\n"; }
现象原因解释
计算结果和编译器输出不符的核心原因有两个:
- 混淆了指针和指针指向的实体:结构体中的
lchild和rchild是Node*类型的指针,不是Node类型的完整实例。指针本身只存储内存地址,长度是固定值,和它指向的内容大小没有关系。如果结构体中真的嵌套定义同类型的完整实例,会出现无限递归的定义矛盾——计算Node大小需要先知道内部成员Node的大小,永远无法得到确定值,这种写法编译器会直接报错。 - 没有匹配当前编译环境的指针长度:你当前使用的是32位编译目标,此环境下所有类型的指针长度都为4字节。逐成员计算结构体大小:
- 3个int类型成员
key、ltag、rtag,每个占4字节,合计12字节 - 2个指针类型成员
lchild、rchild,每个占4字节,合计8字节 - 所有成员的对齐要求都是4字节,排列时不需要插入额外的填充字节,总大小为
12+8=20字节,和编译器给出的结果完全吻合。
- 3个int类型成员
如果切换到64位编译环境,指针长度会变为8字节,此时结构体总大小会是
12 + 16 = 28字节,再加上末尾对齐填充到8的倍数,最终大小为32字节,也不会得到推算的36字节结果。

内容的提问来源于stack exchange,提问作者Tonia James
相关产品推荐
相关产品推荐

