You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:17:17