以下代码中的运行时错误

use*_*975 0 c runtime-error

根据我的说法,以下代码应该成功运行,但在运行时失败.我没有得到原因:

 void main()
 {
   int arr[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
   int *m=arr[0];
   int **p=&m;
   p=p+1;
   printf("%d",**p);

  }
Run Code Online (Sandbox Code Playgroud)

a.exe在gcc编译器,Windows 7 64位运行时已停止运行

Som*_*ude 8

数组数组和指针指针是完全不同的,不能互换使用.

例如,如果您查看数组,arr它在内存中看起来就像这样

+-----------+-----------+-----------+-----------+-----+-----------+
| arr[0][0] | arr[0][1] | arr[0][2] | arr[1][0] | ... | arr[4][2] |
+-----------+-----------+-----------+-----------+-----+-----------+

当你有指向指针时p,程序并不真正知道它指向一个数组数组,而是被视为一个指针数组,在内存中看起来像这样:

+------+------+------+-----+
| p[0] | p[1] | p[2] | ... |
+------+------+------+-----+
  |      |      |
  |      |      v
  |      |      something
  |      v
  |      something
  v
  something

所以,当你做p + 1你到p[1]这显然是不一样的arr[1].

  • @GrijeshChauhan哈哈,不,还是手工做:) (2认同)