为什么这总是指向类似的价值?

时间:2016-05-27 02:07:13

标签: c multidimensional-array

出于好奇,我运行了这个简单的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],抱歉我没有说清楚

2 个答案:

答案 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));
相关问题