等价于两个指针的C指针问题

问题描述 投票:-1回答:2

请注意,我在stackoverflow中经历了几个与指针算术有关的问题,但是我无法得到类似的问题。可能是该问题已经存在,我不知道要搜索的适当标签。这是我对C编程的怀疑。

第一个程序

#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",p[0][0]);
        return 0;
    }

输出为1

第二程序

第7行更改为

p[1] = (int *)malloc(2 * sizeof(int));

输出为0;

这两个程序看起来都差不多,但是它们给出的结果不同。我只是无法理解该算法。谁能帮忙。

c
2个回答
5
投票

p[1] = p[0];使p[1](它是一个指针)指向same存储器,就像p[0]指向。

[p[1] = (int *)malloc(2 * sizeof(int));]动态分配new内存,并让p[1]指向该内存。

因此,如果您修改p[1][i],则在第一种情况下修改的是与p[0][i]相同的对象,但在第二种情况下没有。


0
投票

长话短说。在第一种情况下。在分配的单个存储位置中保存了数据。在第二种情况下。内存分配了两次,因此存在2个单独的内存位置,用于保存单独的数据。希望你能解决剩下的问题

© www.soinside.com 2019 - 2024. All rights reserved.