[英]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==1
和j==0
,您將 1 存儲到該對象,這會覆蓋您在i==0
和j==0
時放置在那里的j==0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.