请原谅这个令人困惑的问题标题,但我不确定如何更清楚地表达它。
在 C 语言中,越界访问数组被归类为未定义行为。然而,数组元素保证在内存中连续排列,并且数组下标运算符是指针算术的语法糖(例如x[3] == *(x + 3)
)。因此,我个人希望下面的代码的行为是明确定义的:
int array[10][10];
int i = array[0][15]; // i == array[1][5]?
如果我对标准的解释是正确的,这将是未定义的行为。我错了吗?
根据标准,这显然是未定义的行为,因为这种情况在本节中明确列出J.2 未定义行为(在在线 C99 标准草案中找到):
数组下标超出范围,即使对象明显是
使用给定的下标可访问(如左值表达式中所示)a[1][7]
鉴于声明int a[4][5]
)(6.5.6)。
你的例子仍然可以工作,实际上我在 C 代码中见过很多这样的情况;不过,准确来说,是UB。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)