指向指针的指针,我迷失了

4
这是我的代码,它可以编译和运行:
#include <stdio.h> 
#include <stdlib.h>

int 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("p[0][0] = %d",p[0][0]); 

    return 0; 
}

当运行这个程序时,我得到的是:P[0][0] = 1。为什么不是P[0][0] = 0?

1
问题在于 p[1] = p[0]; 这里。 - Ôrel
@Ôrel 为什么?请解释。 - DarkMakukudo
2
永远不要强制转换malloc的结果。 - WedaPashi
2个回答

7
你让 p [0]p [1] 指向相同的内存位置。稍后你运行了这个循环:
for(i = 0; i < 2; i++) 
            for(j = 0; j < 2; j++) 
                    p[i][j] = i + j;

这段代码将p[0][0]设置为0,但紧接着又将p[1][0]设置为1。由于p[0]p[1]相等,最终p[0][0]的值变成了1

你可能本意想要做的是:

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

还有一个单独的 malloc 用于 p[1]。像这样:

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

1
那么根据你的解释,我们需要为p[1]分配不同的内存空间吗? p[1] = (int *)malloc(2 * sizeof(int)); - DarkMakukudo
@maku:是的,否则它们只是指针,并将指向相同的内存块。 - cruxion effux

4

P[1]和P[0]被分配到同一内存位置。因此,对P[1]的任何更改都会影响P[0]。你应该为P[1]分配单独的空间。

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

抱歉,这是我的一个老习惯。谢谢。 - Sourav Kanta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接