内存中的多维数组

克里斯·MM

我想知道C ++标准是否保证将多维数组(不动态分配)展平为一模一样的一维数组。例如,如果我有

char x[100];
char y[10][10];

这两个都相等吗?我知道大多数编译器都会变平y,但这是否真的可以保证发生?阅读11.3.4节C ++标准的数组,我实际上找不到任何可以保证这一点的地方。

C ++标准保证y[i]紧随其后y[i-1]因为y[i-1]是10个字符长,所以从逻辑上讲,y[i]应该在内存中的10个字符后发生;但是,编译器是否可以填充y[i-1]额外的字符以保持y[i]对齐?

内森·奥利弗

您要查找的内容可在[dcl.array] / 6中找到

类型为“ NU数组”的对象包含一个连续分配的非空的N个子对象集,该子对象类型为U,称为数组的元素,编号为0到N-1。

这说明如果您有一个像这样的数组,则内存中int arr[10]有10int个连续的数组该定义可以递归工作,但是如果您有

int arr[5][10]

那么您拥有的是一个由5个int[10]数组组成的数组。如果我们从上面应用定义,那么我们知道5个int[10]数组是连续的,然后int[10]本身是连续的,因此所有50个int都是连续的。因此,是的,二维数组看起来就像内存中的一维数组一样,因为实际上这就是它们。

这并不意味着您可以获取指向的指针arr[0][0]并对其进行迭代arr[4][9][expr.add] / 4

当将具有整数类型的表达式J添加到指针类型的表达式P或从其中减去时,结果为P类型。

  • 如果P的值为空指针值,J的值为0,则结果为空指针值。

  • 否则,如果P指向具有n个元素([dcl.array])的数组对象x的数组元素i,则表达式P + J和J + P(其中J的值为j)指向(可能是假设的) )如果0≤i+j≤n,则x的数组元素i + j,如果0≤i-j≤n,则表达式P-J指向x的(可能是假设的)数组元素ij。

  • 否则,行为是不确定的。

这说明如果您有一个指向数组的指针,则可以添加到其中的有效索引为[0, array_size]所以如果你做了

int * it = &arr[0][0]

那么it指向的是第一个数组的第一个元素,这意味着您只能合法地it增加到,it + 10因为那是第一个数组的过去那么end元素。进入第二个数组的是UB,即使它们是连续的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章