C语言中二维数组*a、*b的sizeof结果为16的原理咨询
问题原因及底层逻辑解释
1. 两个数组的类型完全一致
你给出的两种初始化写法只是C语言提供的语法糖,a和b最终的类型完全相同,都是 int [3][4](即「元素为int[4]类型、长度为3的数组」),内存布局也完全一致,都是连续存储12个int类型数据,没有任何差异。
2. 核心规则:sizeof与数组类型的特性
C语言中有两个关键规则决定了最终的输出结果:
- 只有当数组名参与算术运算、作为函数参数传递等场景时,才会发生数组退化为指向首元素的指针的转换;当数组名作为
sizeof运算符的操作数时,不会发生退化,sizeof会直接计算该数组类型的总字节大小。 - 二维数组本质是「数组的数组」:对于类型为
int [3][4]的数组a来说,它的每个元素都是int [4]类型(长度为4的int数组)。对a解引用得到的*a,就是a的首元素,类型为int [4]。
3. 大小计算逻辑
通常主流编译器中int类型占4字节,那么长度为4的int数组的总字节数为:4 * 4 = 16
因此sizeof(*a)和sizeof(*b)的结果都是16。
补充验证:如果打印
sizeof(a),会得到48的结果,对应整个二维数组3行共12个int的总大小;如果打印sizeof(**a),会得到4的结果,对应*a解引用后得到的单个int元素的大小。
内容的提问来源于stack exchange,提问作者Hayato Koyama
相关产品推荐
相关产品推荐

