代码结果的说明

时间:2015-02-23 23:01:34

标签: c arrays pointers

你能解释一下为什么这段代码中2维数组的第一个元素是1?

#include <stdio.h>
#include <stdlib.h>
   int main(void) {
       int i,j;
       int **p = (int **)malloc(2 * sizeof(int *));
       p[0] = (int *)malloc(2 * sizeof(int));
       p[1] = p[0];
       for(i = 0; i < 2; i++)
               for(j = 0; j < 2; j++){
                   printf("i=%d & j=%d\t",i,j);
                   p[i][j] = i + j;
                   printf("p[%d][%d]=%d\n",i,j,p[i][j]);
                   printf("this is the result of the first element %d\n",p[0][0]);
               }


       printf("this is the result %d\n",p[0][0]);
       return 0;
   }

结果是:

  

i = 0&amp; j = 0 p [0] [0] = 0

     

这是第一个元素0的结果

     

i = 0&amp; j = 1 p [0] [1] = 1

     

这是第一个元素0的结果

     

i = 1&amp; j = 0 p [1] [0] = 1

     

这是第一个元素1的结果

     

i = 1&amp; j = 1 p [1] [1] = 2

     

这是第一个元素1的结果

     

这是结果1

     

按关闭此窗口...

2 个答案:

答案 0 :(得分:3)

因为p[0]p[1]这两行确实相同。

p是一个由两个指针组成的数组:

int **p = (int **)malloc(2 * sizeof(int *));

第一个指向大小为2的数组:

p[0] = (int *)malloc(2 * sizeof(int));

第二个指向同一个数组:

p[1] = p[0];

因此对p[1][0]的任何修改都会反映在p[0][0]上,因为它们都指向内存中的相同位置。您可以验证,您已将1分配给p[1][0],因此p[0][0]也变为1

答案 1 :(得分:1)

我试图在图中解释(抱歉,但更容易)。enter image description here

所以要纠正你的错误并声明一个合适的二维矩阵,代替malloc p [0] for(int i=0; i < 2;i++)p[i] = (int *)malloc(2*sizeof(int));