2011-12-08 56 views
4

this参考,在C似乎下列行为是不确定的。我可以使用指针访问多维数组吗?

int my_array[100][50]; 
int *p = my_array[0]; 
p[50]; // UB 

在C++ 03或C++ 11中有参考证实吗?

+0

为什么你认为'P [50]'包括未定义行为? –

+0

有趣的是,我可以用'gcc -Wall -Wextra'编译你的例子,并且不会收到任何未定义行为的警告;将'p [50]'改为'p [50] = 1;'清除“无效”警告,并确保它知道它应该生成代码。 (如果你想确保它不会优化线路,请添加一些'printf(3)'调用。) – sarnold

+0

@Let_Me_Be:读取链接。似乎是问两个不同的事情,需要澄清他是否想知道二维数组指针(按照链接)或静态数组(根据他的代码)。 – tinman

回答

6

是在+运营商的说明。你不能取消引用C中的指针,因为它已经超过了第一个子数组的结束指针。在C++中,这当前是合法的,因为指针指向为一个有效的整数(指向关系的点在第3节的某处定义)。但是,在两个标准中,添加超过50个都会产生未定义的行为

一个DR最近发送到C++委员会有关规则解引用这种“有效凭空”指针可以间接引用,所以我不会依靠这一点。

+0

该死的上下文中的概念“实体”的,我没有C89标准在这里,而是指向多维数组的情况下array_一个_Pointer C99会谈,我会亲自解释这作为定义行为,因为指针并不指向原始数组之外,只在子数组之外。 –

+0

要澄清,当您说“是”时,您的意思是“是的行为是未定义的”; (问题标题是实际文章中问题的否定!)。并且说你不能添加超过50的标准部分是'[expr.add]#5'。 –

-1
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,

我认为你可以那样做。