我无法理解C中的这段代码片段

时间:2014-02-11 16:39:00

标签: c code-snippets

我似乎无法理解为什么这个代码打印1作为答案。 我正在学习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;
}

在我看来应该打印0,但似乎我错了。

2 个答案:

答案 0 :(得分:2)

你对这些指针感到困惑。 p[0]int的指针,p[1]也是。

代码使p[0]p[1]指向同一地址:

p[1] = p[0];

这导致p[i][j]引用相同的对象,无论i是0还是1.嵌套循环首先访问p[0][0],将其设置为0,但是然后访问p[1][0](与p[0][0]相同的对象,这将导致它被分配1。

这里的关键点是p[0][0]p[1][0]是相同的。

答案 1 :(得分:0)

p[0]p[1]都是int *类型(即指针)。之后

p[1] = p[0];

p[1]p[0]都指向同一地址,这使p[0][0]p[1][0]相同。该值由其持续的更新确定。并且p[1][0]最后更新此值,这使得最终结果为1.

如果您将代码更改为:

for(i = 1; i >= 0; i--)
    for(j = 1; j >= 0; j--)
        p[i][j] = i + j;
printf("%d",p[1][0]);

猜猜是什么,它会打印0.希望它有所帮助。