从this参考,在C似乎下列行为是不确定的。我可以使用指针访问多维数组吗?
int my_array[100][50];
int *p = my_array[0];
p[50]; // UB
在C++ 03或C++ 11中有参考证实吗?
从this参考,在C似乎下列行为是不确定的。我可以使用指针访问多维数组吗?
int my_array[100][50];
int *p = my_array[0];
p[50]; // UB
在C++ 03或C++ 11中有参考证实吗?
是在+运营商的说明。你不能取消引用C中的指针,因为它已经超过了第一个子数组的结束指针。在C++中,这当前是合法的,因为指针指向为一个有效的整数(指向关系的点在第3节的某处定义)。但是,在两个标准中,添加超过50个都会产生未定义的行为
一个DR最近发送到C++委员会有关规则解引用这种“有效凭空”指针可以间接引用,所以我不会依靠这一点。
该死的上下文中的概念“实体”的,我没有C89标准在这里,而是指向多维数组的情况下array_一个_Pointer C99会谈,我会亲自解释这作为定义行为,因为指针并不指向原始数组之外,只在子数组之外。 –
要澄清,当您说“是”时,您的意思是“是的行为是未定义的”; (问题标题是实际文章中问题的否定!)。并且说你不能添加超过50的标准部分是'[expr.add]#5'。 –
int my_array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
for(i=0;i<3*3;i++)
{
printf("%d,",*(*my_array+i));
}
输出 1,2,3,4,5,6,7,8,9,
我认为你可以那样做。
为什么你认为'P [50]'包括未定义行为? –
有趣的是,我可以用'gcc -Wall -Wextra'编译你的例子,并且不会收到任何未定义行为的警告;将'p [50]'改为'p [50] = 1;'清除“无效”警告,并确保它知道它应该生成代码。 (如果你想确保它不会优化线路,请添加一些'printf(3)'调用。) – sarnold
@Let_Me_Be:读取链接。似乎是问两个不同的事情,需要澄清他是否想知道二维数组指针(按照链接)或静态数组(根据他的代码)。 – tinman