是否通过指向第一个元素UB的指针访问多维数组的中间?

时间:2018-11-28 18:50:19

标签: c++ multidimensional-array

考虑以下代码:

import Loadable from 'react-loadable';
import Loading from './YOUR-LOADING-COMPONENT';

const LoadableWallet = Loadable({
  loader: () => import('eth-lightwallet/dist/lightwallet.min.js'),
  loading: Loading,
});

export default class Wallet extends React.Component {
  render() {
    return <LoadableWallet/>;
  }
}

或等效地:

int data[2][2];
int* p(&data[0][0]);
p[3] = 0;

我不清楚这是否是未定义的行为。 int data[2][2]; int (&row0)[2] = data[0]; int* p = &row0[0]; p[3] = 0; 指向具有2个元素的数组p的第一个元素的指针,因此row0访问数组的末尾,根据7.6.6 [expr.add ]:

  
      
  • 当将具有整数类型的表达式J添加到指针类型的表达式P或从其中减去时,结果为P类型。      
        
    • 如果P的值为空指针值,J的值为0,则结果为空指针值。
    •   
    • 否则,如果P指向具有p[3]个元素的数组对象x[i]的元素x,则表达式P + J和J + P(其中J具有值n指向(可能是假设的)元素j,如果0≤x[i+j]i + j ,并且表达式P-J指向(可能是-假设)元素n(如果0≤x[i−j]i − j
    •   
    • 否则,行为是不确定的。
    •   
  •   

我看不到标准中对多维数组给予特殊处理的任何内容,因此我只能得出结论,实际上是UB。

我正确吗?

n声明为data的情况如何?这种情况似乎更可能是UB,因为结构可能有填充。

1 个答案:

答案 0 :(得分:8)

是的,您是正确的,没有太多要添加的内容。在C ++类型系统中没有多维数组,只有数组(随意数组的数组中的数组)。

访问超出数组大小的元素是未定义的行为。