考虑以下代码:
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,因为结构可能有填充。
答案 0 :(得分:8)
是的,您是正确的,没有太多要添加的内容。在C ++类型系统中没有多维数组,只有数组(随意数组的数组中的数组)。
访问超出数组大小的元素是未定义的行为。