为何这段C语言代码输出为8,5,5而非8,8,5?
问题分析与解答
首先看这段C代码:
#include<stdio.h> #include<stdlib.h> void f(int x, int* y, int **z) { *z = malloc(sizeof(int)); **z = 4; **z += 1; x += 2; *y += 3; } int main() { int x = 5; int *y = &x; int **z = &y; f(x, y, z); printf("%d, %d, %d", x, *y, **z); return 0; }
你的分析里有个关键错误:函数f里的*z = malloc(...)直接修改了main函数中指针y的指向。
具体拆解:
- main里的z是指向y的二级指针,所以函数f的形参z(二级指针)指向的是main里的y指针本身。
- 当执行
*z = malloc(sizeof(int));时,相当于把main里的y指针重新赋值,让它指向了堆上分配的新内存,不再指向原来的x了。 - 之后
**z =4; **z +=1;把这块新内存的值设为5,这部分你是对的。 - 函数f里的形参y是int*类型,它接收的是main里y的初始值(也就是&x),所以
*y +=3;确实会把main里的x从5改成8,这部分你也没错。 - 但回到main后,y已经被f函数修改了指向,现在y指向的是堆上那块值为5的内存,而不是原来的x了。
所以最终输出是8, 5, 5,而非你预期的8,8,5。
内容的提问来源于stack exchange,提问作者Arjenton
相关产品推荐
相关产品推荐

