2015-02-23 86 views
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 & J = 0 P [0] [0] = 0

这是第一个元素0

的结果i = 0 & j = 1 p [0] [1] = 1

这是第一个元素的结果0

I = 1 & J = 0 P [1] [0] = 1

这是第一个元素的结果1

I = 1 & J = 1个P [1] [1] = 2

这是第一个元素的结果1

这是结果1点

按关闭该窗口...

+0

你打算'p [0]'和'p [1]'引用*相同的单数行吗? – WhozCraig 2015-02-23 23:04:32

+0

最有可能与您的问题没有关系,但[**不会投出'malloc()'**](http://stackoverflow.com/a/605858/3488231)的结果。 – ace 2015-02-23 23:05:07

回答

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

+0

So p [1] = p [0];这是错误,它应该是一个新的malloc得到一个2维数组,我想 – kyrpav 2015-02-23 23:07:42

+0

是的,完全@kyrpav。 – 2015-02-23 23:08:07

1

我试图在图中解释(对不起,但它更容易)。 enter image description here

所以要纠正你的错误,并申报了适当的2-d矩阵,取代的malloc为P [0]for(int i=0; i < 2;i++)p[i] = (int *)malloc(2*sizeof(int));