C 标准中未定义行为的示例之一是 (J.2):
— 数组下标超出范围,即使对象显然可以使用给定的下标访问(如在给定声明 int a[4][5] 的左值表达式 a[1][7] 中)(6.5.6)
如果声明从int a[4][5]
to更改unsigned char a[4][5]
,访问是否a[1][7]
仍会导致未定义的行为?我的观点是它没有,但我从其他人那里听到了不同意的意见,我想看看其他一些可能成为 SO 专家的想法。
我的推理:
按照对 6.2.6.1 第 4 段和 6.5 第 7 段的通常解释,对象的表示
a
是sizeof (unsigned char [4][5])*CHAR_BIT
位,并且可以作为unsigned char [20]
与对象重叠的类型数组来访问。a[1]
具有unsigned char [5]
作为左值的类型,但在表达式中使用(作为运算符的操作数[]
,或等效地作为运算+
符 in的操作数*(a[1]+7)
),它衰减为类型的指针unsigned char *
。的值
a[1]
也是一个指向“表示”a
形式的字节的指针unsigned char [20]
。这样解释,加7a[1]
有效。