C++ 我可以使用指针访问多维数组吗?

C++ 我可以使用指针访问多维数组吗?,c++,arrays,pointers,multidimensional-array,C++,Arrays,Pointers,Multidimensional Array,从参考资料来看,在C中,以下行为似乎是未定义的 int my_array[100][50]; int *p = my_array[0]; p[50]; // UB C++03或C++11中是否有一个引用证实了这一点?intMy_数组[3][3]={{1,2,3},{4,5,6},{7,8,9}; 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

从参考资料来看,在C中,以下行为似乎是未定义的

int my_array[100][50];
int *p = my_array[0];
p[50]; // UB
C++03或C++11中是否有一个引用证实了这一点?

intMy_数组[3][3]={{1,2,3},{4,5,6},{7,8,9};
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));
}

对于(+)运算符的描述,(i=0;i<p>是)。在C中,你可能不去引用那个指针,因为它是第一个子数组的结束指针的过去。在C++中,这个指针是合法的,因为指针指向一个有效的整数(在第3条中的某个点定义了关系点)。然而,在这两个标准中,增加50个以上会产生未定义的行为


最近,DR被送到C++委员会,取消这种“有效超薄”指针的规则可能被撤销,所以我不相信。

为什么你认为<代码> P [ 50 ]?
涉及未定义的行为?有趣的是,我可以使用
gcc-Wall-Wextra
编译您的示例,并且不会得到任何未定义行为的警告;将
p[50]
更改为
p[50]=1;
以消除“无效”警告,并确保它知道应该生成代码。(添加一些
printf(3)
如果您想确保它不会优化掉行,则调用。)@Let_Me_Be:阅读链接。似乎在询问两件不同的事情,需要澄清他是想知道2D数组指针(根据链接)还是静态数组(根据代码)。@让它不停留在int[50]的元素内数组。它是一个自己的实体。子对象是对象,对象是一种实体类型(在c++中)。我不知道“实体”的概念在C.Damn的上下文中,我这里没有C89标准,但C99在多维数组中谈到指向数组的指针,我个人认为这是定义行为,因为指针不指向原始数组之外,只指向子数组之外。澄清一下,当你说“是”时,你的意思是“是的,行为是未定义的”;(问题标题是实际帖子中问题的否定部分!)。标准部分说不能添加超过50个是
[expr.add]#5