【问题标题】:Is it legal to access a bidimensional array as if it where a one-dimensional one? [duplicate]像访问一维数组一样访问二维数组是否合法? [复制]
【发布时间】:2012-06-01 11:04:50
【问题描述】:

可能重复:
May I treat a 2D array as a contiguous 1D array?

考虑以下代码:

int array2d[10][10];
int *array1d = array2d[0];

我从未听说过它不起作用的实现,但是通过array1d 访问和操作array2d 是否合法?标准的哪个部分允许这样做?标准中是否有任何内容阻止实现在每个二级数组之间插入额外的空间或填充(不是它需要的,但仍然需要)?

额外问题:有没有一种方法可以将array2d 作为int[100] 访问,而不需要reinterpret_cast 或C 风格?

【问题讨论】:

  • 您总是可以将它包装在一个类中,该类在内部将其存储为一维数组。
  • 报名参加 c++ 混淆竞赛 :) ?
  • int* array1d = array2d[0];不是更直接一点吗?
  • @ildjarn:确实如此,我当然不习惯转换数组。

标签: c++ language-lawyer


【解决方案1】:

如果没记错的话,标准会将此作为官方未定义行为的示例,但基本上总是有效的。 [编辑:这是我的想法:C99,§J.2(未定义的行为):

  • 数组下标超出范围,即使对象显然可以使用 给定下标(如左值表达式 a[1][7] 给定声明 int 一[4][5])

我不完全确定这是否适用,因为您正在获取数组开头的地址并将其转换为指向基础类型的简单指针。]

数组必须是连续的,因此它不能在数组元素之间插入任何填充。无论您拥有int 数组还是数组数组,都是如此。

【讨论】:

    【解决方案2】:

    这确实是合法的。该标准明确规定多维数组只是更大的一维数组。我没有确切的报价,但我知道这是真的。

    【讨论】:

    • 我最近挖掘了关于 2D 阵列布局的标准(答案 here)。我不确定说数组T[n] 的部分在哪里确切地 n * sizeof(T) 在哪里。
    • 基本上第一个引用中的“包含”让我有点紧张。为什么不使用更强有力的措辞? “包含”只是给出了一个下限。
    • @Jon C++2003, §5.3.3/2: sizeof: 当应用于数组时,结果是数组中的总字节数。这意味着包含 n 个元素的数组的大小是元素大小的 n 倍。
    • 保证sizeof(T[n]) == n * sizeof(T)(有)不足以保证行为正确。别名分析呢?在 OP 的代码中,array1dint[10] 数组内的迭代器——现在假设有一个 int* p = array2d[1];。优化器(将跟踪这些指针的初始化位置)将对 array1dp 访问是否允许使用别名感兴趣。 C++ 作为一门语言不是汇编器,而是编码器和实现之间的契约。
    • 这里没有别名违规。有 n * m 整数,您可以合法地使用 int* 指向它们中的任何一个,并且它们保证是连续的,因此您可以增加指针以移动到下一个。
    猜你喜欢
    • 1970-01-01
    • 2014-06-16
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2020-11-11
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多