出于好奇,我运行了这个简单的C程序,看看我是否可以使用一个索引索引到一个2D数组:
#include <stdio.h>
int main(){
int a[][5] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25}
};
printf("%d, %d\n", a[2][3], a[2*5 + 3]);
return 0;
}
使用gcc -Wall
进行编译时警告我,printf的第三个参数是int*
,因此我将其取消引用并重新编译。这一次,我注意到打印的第二个值是一个始终在32764 - 32767(包括两者)范围内的数字,通常是32764或32765.这是有原因还是只是随机数据?
编辑:收到警告后,我将第三个参数更改为printf到*a[2*5 + 3]
,抱歉我没有说清楚
答案 0 :(得分:4)
是它是随机数据,因为您试图取消引用未定义的内存地址。
a[2 * 5 + 3]
返回第14行的地址,在您的情况下不存在。 *a[2 * 5 + 3]
将成为第14行的第1个元素。
同样根据@iharob的建议,您应该使用%p
代替%d
。
答案 1 :(得分:0)
您正在尝试使用"%d"
运算符打印指针,该运算符是未定义的行为。您必须使用"%p"
。
你想做的事情是可能的,但你做错了。您需要再次取消引用指针,或者可以转换为int *
这样的
printf("%d, %d\n", a[2][3], ((int *) a)[2*5 + 3]);
你也可以这样做
printf("%d, %d\n", a[2][3], *(*a + 2*5 + 3));