gpt4 book ai didi

c++ - 我可以将二维数组视为连续的一维数组吗?

转载 作者:IT老高 更新时间:2023-10-28 12:37:54 27 4
gpt4 key购买 nike

考虑以下代码:

int a[25][80];
a[0][1234] = 56;
int* p = &a[0][0];
p[1234] = 56;

第二行是否调用未定义的行为?第四行呢?

最佳答案

这两行do都会导致未定义的行为。

下标被解释为指针相加后跟一个间接寻址,即 a[0][1234]/p[1234] 等价于 * (a[0] + 1234)/*(p + 1234)。根据[expr.add]/4 (这里我引用最新的草案,而关于OP提出的时间,你可以引用this comment,结论是一样的):

If the expression P points to element x[i] of an array object x with n elements, the expressions P + J and J + P (where J has the value j) point to the (possibly-hypothetical) element x[i+j] if 0≤i+j≤n; otherwise, the behavior is undefined.

因为a[0](衰减到指向a[0][0]的指针)/p指向一个元素a[0] (作为一个数组),而 a[0] 的大小只有 80,行为未定义。


作为语言律师 pointed out in the comment , 以下程序 does not compile .

constexpr int f(const int (&a)[2][3])
{
auto p = &a[0][0];
return p[3];
}

int main()
{
constexpr int a[2][3] = { 1, 2, 3, 4, 5, 6, };
constexpr int i = f(a);
}

当它出现在常量表达式中时,编译器检测到这种未定义的行为。

关于c++ - 我可以将二维数组视为连续的一维数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7269099/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com