[英]Program using dynamic memory allocation
我在 C 中有以下程序。 p[0][0]
是怎么變成 1 的? 有人可以幫助理解嗎?
#include <stdio.h>
#include<stdlib.h>
main()
{
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,%d,%d",i,j,p[i][j]);
printf("\n");
}
printf("%d,%d,%d",i,j,p[0][0]);
}
output 如下
0,0,0
0,1,1
1,0,1
1,1,2
2,2,1
相同的指針分配給p[0]
和p[1]
。 這意味着p[0]
和p[1]
指向同一個數組。 因此,通過p[1]
完成的更新也可以通過p[0]
看到。
在外部for
循環的第二次迭代中,將1
分配給p[1][0]
。 這使得p[0][0]
為1
。
在以下代碼行之后:
int **p=(int **)malloc(2 * sizeof(int *));
p[0]=(int*) malloc(2*sizeof(int));
p[1]=p[0];
這就是 memory 中的內容:
int ** int * int
+---+ +---+ +---+
p: | | ------> | | p[0] -+-> | | p[0][0], p[1][0]
+---+ +---+ | +---+
| | p[1] -+ | | p[0][1], p[1][1]
+---+ +---+
p[0]
和p[1]
指向同一個 2 元素數組,因此您寫入p[0][i]
的任何內容都會反映在p[1][i]
中,反之亦然。
你可能打算做的是
int **p = malloc( 2 * sizeof *p ); // cast not necessary, sizeof *p == sizeof (int *)
p[0] = malloc( 2 * sizeof *p[0] );
p[1] = malloc( 2 * sizeof *p[1] );
這會給你
int ** int * int
+---+ +---+ +---+
p: | | ------> | | p[0] ----> | | p[0][0]
+---+ +---+ +---+
| | p[1] --+ | | p[0][1]
+---+ | +---+
|
| +---+
+-> | | p[1][0]
+---+
| | p[1][1]
+---+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.