簡體   English   中英

為什么這個 C 代碼輸出 1 而不是 0?

[英]Why is does this C code output 1 instead of 0?

為什么這個輸出1? 如果 p[i][j] = i+j; 當 i==0 和 j ==0 時,它不應該輸出 0 那么 p[0][0j] 也應該是 0。 當我運行此代碼時,它輸出 1。

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++)
            p[i][j]=i + j;
            
    printf("%d\n", p[0][0]);
    return 0;
}

繪制您最終在此處獲得的內存布局圖可能會有所幫助:

   +---+
p: | * |
   +-|-+
     |
     V
   +---+       +---+---+
   | *-------> | 1 | 2 |
   +---+   ,-> +---+---+
   | *----'
   +---+

由於p[0]p[1]指向同一個地方,您實際上並沒有得到其余代碼似乎建議的 2x2 數組。

如果你像這樣重寫分配代碼:

int **p = (int **) malloc(2 * sizeof(int*));
for(i = 0; i < 2; i++)
    p[i] = (int*)malloc(2*sizeof(int));

那么你最終會得到這樣的記憶:

   +---+
p: | * |
   +-|-+
     |
     V
   +---+       +---+---+
   | *-------> | 0 | 1 |
   +---+       +---+---+
   | *---.     +---+---+
   +---+  `--> | 1 | 2 |
               +---+---+

現在你會發現p[0][0]將是 0。

因為p[1]p[0]是同一個指針,因此p[1][0]p[0][0]是同一個對象。 因此,當您有i==1j==0 ,您將 1 存儲到該對象,這會覆蓋您在i==0j==0時放置在那里的j==0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM