【问题标题】:Storage order for multidimensional arrays in CC中多维数组的存储顺序
【发布时间】:2018-10-22 08:41:27
【问题描述】:

对于 C 编译器,数组元素是按列优先顺序还是行优先顺序存储的,还是依赖于编译器?

int arr[2][3]={1,2,3,4,5,6};
int array[3][2]={1,2,3,4,5,6};

关于打印 arr 和数组输出: arr:

1 2 3
4 5 6

数组:

1 2
3 4
5 6

它似乎总是更喜欢行主要顺序?

【问题讨论】:

  • 您没有太注意-Wmissing-braces 警告,是吗?
  • 我在看书,给的----->和其他变量的情况一样,声明一个二维数组只为数组在内存中预留空间。没有值存储在其中。二维数组的初始化方式与一维数组的初始化方式相同。例如,int 标记[2][3]={90, 87, 78, 68, 62, 71};请注意,二维数组的初始化是逐行完成的。上面的语句也可以写成:int Marks[2][3]={{90,87,78},{68,62,71}};
  • 这也是在没有任何警告的情况下运行的。
  • 在 gcc/clang 上,你应该至少使用 -Wall -Wextra(你也应该使用 -pedantic),在 VS (cl.exe) 上你应该使用 /W3。如果这样做,您将收到警告。 arr 的声明应该有 int arr[2][3] = {{1,2,3},{4,5,6}}; 在没有警告的情况下编译之前不要接受代码。

标签: c arrays multidimensional-array memory-layout


【解决方案1】:

打印了数组。输出按照您打印数组元素的任何顺序。所以你看到的与数组元素在内存中的存储顺序无关。

int arr[2][3] 表示你有三个数组,每个数组中存储的对象是一个int[2]。对象总是连续存储的,因此第一个 int[2] 存储在连续的内存中,然后是第二个 int[2],然后是第三个 int[2]。 any C 实现也是如此。

【讨论】:

  • 你肯定把它弄反了?您的描述对于int arr[3][2] 是正确的,但对于int arr[2][3] 是不正确的。
【解决方案2】:

标准规定行主要顺序。

6.5.2.1p3:

连续的下标运算符指定一个元素 多维数组对象。如果 E 是一个 n 维数组 (n >= 2) 尺寸为 i x j x 。 . . x k,然后是 E(用作非 lvalue) 被转换为指向 (n - 1) 维数组的指针 尺寸 j x 。 . . xk。如果一元 * 运算符应用于此 指针显式地或隐式地作为下标的结果, 结果是引用的 (n - 1) 维数组,它本身是 如果用作左值以外的其他值,则转换为指针。它跟随 由此 数组以行主要顺序存储(最后一个下标 变化最快)

(强调我的)

【讨论】:

  • 我还有一个问题——为什么双指针(**ptr)不能用来访问数组?
  • 因为没有地方存储指针。请把“双指针”从你的脑海中抹去。有指向指针的指针,但这不是“双指针”。
  • 我在附议 gnasher729。多维数组≠乘间接指针。虽然您可以像 two_dimensional_array[1][0] 一样执行 doubly_indirect[1][0](如果 doubly_indirect 是包含至少 2 个指针的指针数组),但 [1][0] 在这两种情况下的含义非常不同,但这可能是不同的主题问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 2012-08-13
  • 2015-03-03
  • 1970-01-01
  • 2014-04-30
相关资源
最近更新 更多