You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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";
}
现象原因解释

计算结果和编译器输出不符的核心原因有两个:

  1. 混淆了指针和指针指向的实体:结构体中的lchild和rchild是Node*类型的指针,不是Node类型的完整实例。指针本身只存储内存地址,长度是固定值,和它指向的内容大小没有关系。如果结构体中真的嵌套定义同类型的完整实例,会出现无限递归的定义矛盾——计算Node大小需要先知道内部成员Node的大小,永远无法得到确定值,这种写法编译器会直接报错。
  2. 没有匹配当前编译环境的指针长度:你当前使用的是32位编译目标,此环境下所有类型的指针长度都为4字节。逐成员计算结构体大小:
    • 3个int类型成员key、ltag、rtag,每个占4字节,合计12字节
    • 2个指针类型成员lchild、rchild,每个占4字节,合计8字节
    • 所有成员的对齐要求都是4字节,排列时不需要插入额外的填充字节,总大小为12+8=20字节,和编译器给出的结果完全吻合。

如果切换到64位编译环境,指针长度会变为8字节,此时结构体总大小会是12 + 16 = 28字节,再加上末尾对齐填充到8的倍数,最终大小为32字节,也不会得到推算的36字节结果。

IDE悬浮提示sizeof(Node)值为(size_t)20U的截图

内容的提问来源于stack exchange,提问作者Tonia James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 08:12:22