你能解释一下为什么这段代码中2维数组的第一个元素是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&amp; j = 0 p [0] [0] = 0
这是第一个元素0的结果
i = 0&amp; j = 1 p [0] [1] = 1
这是第一个元素0的结果
i = 1&amp; j = 0 p [1] [0] = 1
这是第一个元素1的结果
i = 1&amp; j = 1 p [1] [1] = 2
这是第一个元素1的结果
这是结果1
按关闭此窗口...
答案 0 :(得分: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
。
答案 1 :(得分:1)
我试图在图中解释(抱歉,但更容易)。
所以要纠正你的错误并声明一个合适的二维矩阵,代替malloc p [0] 写for(int i=0; i < 2;i++)p[i] = (int *)malloc(2*sizeof(int));
。