C 了解类2D阵列的内存分配

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 *)

我试图理解当代码被打印出来时会发生什么

我知道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 *));
    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]);