请考虑以下代码:
int array2d[10][10];
int *array1d = array2d[0];
我从来没有听说过一项无法实施的实施方案,但通过array2d
访问和操纵array1d
是否合法?标准的哪个部分允许这个?标准中是否存在阻止实现在每个第二级数组之间插入额外空间或填充的内容(不是所需的,但仍然如此)?
加分问题:有没有办法array2d
作为int[100]
访问,不需要reinterpret_cast
或C风格的?{/ p>
答案 0 :(得分:5)
如果内存服务,标准会将此作为官方未定义行为的示例,但基本上始终有效。 [编辑:这就是我的想法:C99,§J.2(未定义的行为):
- 数组下标超出范围,即使某个对象显然可以使用 给定下标(如左边的表达式a [1] [7]给出声明int 一个[4] [5])
我不是完全确实适用但是,因为你获得了数组开头的地址并将其转换为指向底层类型的简单指针。]
数组必须是连续的,因此它不能在数组的元素之间插入任何填充。无论你有一个int
数组还是一个数组数组都是如此。
答案 1 :(得分:0)
这确实是合法的。该标准明确指出多维数组只是更大的1D数组。我没有准确的报价,但我知道这是真的。