C 了解类2D阵列的内存分配
我试图理解当代码被打印出来时会发生什么 我知道p[0]和p[1]指向同一个东西,如果p[1]有自己的malloc,p[0][0]将得到0,但它得到1 我试图理解是什么导致了1。所以这个代码的结果是:C 了解类2D阵列的内存分配,c,malloc,C,Malloc,我试图理解当代码被打印出来时会发生什么 我知道p[0]和p[1]指向同一个东西,如果p[1]有自己的malloc,p[0][0]将得到0,但它得到1 我试图理解是什么导致了1。所以这个代码的结果是: 1 2 1 2 但我不知道怎么做 守则: #include <stdio.h> #include <stdlib.h> int main(void) { int i,j; int **p = (int **)malloc(2 * sizeof(int *)
1
2
1
2
但我不知道怎么做
守则:
#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++)
p[i][j] = i + j;
printf("%d\n",p[0][0]);
printf("%d\n",p[0][1]);
printf("%d\n",p[1][0]);
printf("%d\n",p[1][1]);
return 0;
}
设q是p[0]=int*malloc2*sizeofint;中malloc的结果
然后,在该赋值之后,p[1]=p[0];,p[0]和p[1]都是q
然后语句p[i][j]=i+j;等于q[j]=i+j;,不管我是0还是1
然后这些循环:
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
p[i][j] = i + j;
当我1岁时,有两项作业:
后两个覆盖前两个,因此结果是q[0]包含1,q[1]包含2
然后这个代码:
printf("%d\n",p[0][0]);
printf("%d\n",p[0][1]);
printf("%d\n",p[1][0]);
printf("%d\n",p[1][1]);
相当于:
printf("%d\n",q[0]);
printf("%d\n",q[1]);
printf("%d\n",q[0]);
printf("%d\n",q[1]);
因此它打印1、2、1和2。让q是p[0]=int*malloc2*sizeofint;中malloc的结果
然后,在该赋值之后,p[1]=p[0];,p[0]和p[1]都是q
然后语句p[i][j]=i+j;等于q[j]=i+j;,不管我是0还是1
然后这些循环:
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
p[i][j] = i + j;
当我1岁时,有两项作业:
后两个覆盖前两个,因此结果是q[0]包含1,q[1]包含2
然后这个代码:
printf("%d\n",p[0][0]);
printf("%d\n",p[0][1]);
printf("%d\n",p[1][0]);
printf("%d\n",p[1][1]);
相当于:
printf("%d\n",q[0]);
printf("%d\n",q[1]);
printf("%d\n",q[0]);
printf("%d\n",q[1]);
因此它打印1、2、1和2。这两个值都设置了两次,一次通过p[0][j],第二次通过p[1][j]。由于第二次i为1,输入这些单元格的值为1+j。两个值都设置了两次,一次通过p[0][j],第二次通过p[1][j]。因为第二次i是1,所以输入到这些单元格中的值是1+j。代码用注释解释:
// allocating space for 2 pointers to int
// this emulates an array of pointers to int *p[2]
int **p = malloc(2 * sizeof(int *));
我还应该注意,不需要强制转换malloc return。用注释解释代码:
// allocating space for 2 pointers to int
// this emulates an array of pointers to int *p[2]
int **p = malloc(2 * sizeof(int *));
我还应该注意,不需要强制转换malloc返回。指针p[1]被设置为指针p[0]的值
因此,由于这种动态内存分配,两个指针都指向具有两个元素的同一数组
p[0] = (int *)malloc(2 * sizeof(int));
这些循环中的外部for循环
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
p[i][j] = i + j;
因此,p[1][0]被设置为1+0,即在循环的第一次迭代中为1,p[1][1]被设置为1+1,即在循环的第二次迭代中为2
在这些printf调用中,使用指向同一数组的指针p[0]和p[1]将同一数组输出两次
printf("%d\n",p[0][0]);
printf("%d\n",p[0][1]);
printf("%d\n",p[1][0]);
printf("%d\n",p[1][1]);
这些调用相当于以下两种调用
printf("%d\n",p[0][0]);
printf("%d\n",p[0][1]);
printf("%d\n",p[0][0]);
printf("%d\n",p[0][1]);
或者
printf("%d\n",p[1][0]);
printf("%d\n",p[1][1]);
printf("%d\n",p[1][0]);
printf("%d\n",p[1][1]);
指针p[1]被设置为指针p[0]的值
因此,由于这种动态内存分配,两个指针都指向具有两个元素的同一数组
p[0] = (int *)malloc(2 * sizeof(int));
这些循环中的外部for循环
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
p[i][j] = i + j;
因此,p[1][0]被设置为1+0,即在循环的第一次迭代中为1,p[1][1]被设置为1+1,即在循环的第二次迭代中为2
在这些printf调用中,使用指向同一数组的指针p[0]和p[1]将同一数组输出两次
printf("%d\n",p[0][0]);
printf("%d\n",p[0][1]);
printf("%d\n",p[1][0]);
printf("%d\n",p[1][1]);
这些调用相当于以下两种调用
printf("%d\n",p[0][0]);
printf("%d\n",p[0][1]);
printf("%d\n",p[0][0]);
printf("%d\n",p[0][1]);
或者
printf("%d\n",p[1][0]);
printf("%d\n",p[1][1]);
printf("%d\n",p[1][0]);
printf("%d\n",p[1][1]);