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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:21:02