C语言数组sizeof计算疑问:为何a[1]+1与a+1的sizeof结果均为8
为什么你的C语言代码输出和预期不符?
核心问题是你混淆了数组名在表达式中的类型退化规则,同时误解了sizeof的作用对象——它求的是表达式结果类型的大小,不是把+两边的sizeof值做加法。
逐个拆解你的代码:
1. 分析sizeof(a[1]+1)
a[1]是二维数组a的第二行,本身类型是int[3](长度为3的int数组)。但当它参与+1运算时,C语言会把数组名自动退化为指向数组首元素的指针,也就是int*类型(指向a[1][0]的指针)。a[1]+1是指针加法操作,结果是指向a[1][1]的int*指针。sizeof求的是这个指针类型的大小,在64位系统上指针大小统一为8字节(32位系统是4字节),所以输出8。- 你的错误预期是把
a[1]+1当成了sizeof(a[1]) + sizeof(1),但这完全误解了表达式的含义——+是指针偏移操作,不是大小相加。
2. 分析sizeof(a+1)
a是int[3][3]类型的二维数组,当它参与+1运算时,同样会退化为指针,但二维数组退化后的指针类型是int(*)[3](指向长度为3的int数组的指针),因为二维数组的"首元素"是它的第一行(int[3]类型)。a+1是指针偏移操作,指向二维数组的第二行(a[1]),结果类型还是int(*)[3],这依然是一个指针类型,所以sizeof它的大小在64位系统上是8字节,输出8。- 你的错误预期是把
a+1当成了sizeof(a) + sizeof(1),同样混淆了操作的本质——这是指针偏移,不是大小相加。
补充:数组名不会退化的场景
只有在以下场景中,数组名会保持原数组类型:
- 作为
sizeof的直接操作数:比如sizeof(a)会得到整个二维数组的大小(334=36字节,假设int为4字节);sizeof(a[1])会得到一行的大小(3*4=12字节)。 - 作为
&的操作数:比如&a的类型是int(*)[3][3](指向二维数组的指针)。 - 作为
_Alignof的操作数。
内容的提问来源于stack exchange,提问作者nicolachter
相关产品推荐
相关产品推荐

