内存中的多维数组

我想知道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]对齐?

ningruohai1 回答:内存中的多维数组

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

中找到
  

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

这说明,如果您有一个像int arr[10]这样的数组,那么要有10个int在内存中是连续的。尽管此定义可以递归工作,但如果有

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≤,则表达式P-J指向x的(可能假设的)数组元素ij

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

  •   

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

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

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

本文链接:https://www.f2er.com/3164806.html

大家都在问