2015-02-23 121 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));