我想知道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] 删除。
我来说两句