hiy*_*hiy 7 c arrays multidimensional-array undefined-behavior
请原谅令人困惑的问题标题,但我不确定如何更清楚地表达它。
在 C 中,越界访问数组被归类为未定义行为。然而,数组元素保证在内存中连续排列,数组下标运算符是指针运算的语法糖(例如x[3] == *(x + 3))。因此,我个人希望以下代码的行为是明确定义的:
int array[10][10];
int i = array[0][15]; // i == array[1][5]?
Run Code Online (Sandbox Code Playgroud)
如果我对标准的解释是正确的,这将是未定义的行为。我错了吗?
根据标准,这显然是未定义行为,因为在J.2 未定义行为部分(在在线 C99 标准草案中找到)中明确列出了这种情况:
数组下标超出范围,即使对象显然可以使用给定的下标访问(如
a[1][7]给定声明的左值表达式int a[4][5])(6.5.6)。
你的例子仍然可以工作,实际上我在C代码中看到了很多这样的情况;但是,准确地说,它是UB。
该标准非常清楚地表明unsigned char arr[10][10];,arr[0][x]如果x超过 9 ,则尝试访问将产生 UB 。
然而,我认为同样清楚的是,标准的作者打算允许代码将任何对象的地址,包括多维数组,作为字符指针,然后索引该指针以访问所有字节物体。
如果标准说arr[0]产生一个char*只能用于访问前十个元素(char*)arr的指针,但会产生一个可以访问整个数组的指针,这将满足上述两个目标,但我在表明arr[0]和(char*)arr不相等的标准。
最有可能的是,标准的作者期望实现会在这种极端情况下寻求明智的行为,无论标准是否完整地描述了它们。我不确定 clang 和 gcc 是否符合关于这个特定问题的这种期望,但这种期望通常不成立。
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |