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

为什么C语言中两个Reference By Call实现的求平方函数一个可用一个失效

两段代码运行结果差异的核心原因

第一段代码可正常运行的逻辑

void sqrNum(int *x){
    *x = *x * *x;
    return;
 }
  • 调用函数时你会传入外部int变量的地址给形参x,此时x是指向有效内存的合法指针
  • 对x解引用得到的*x,直接对应外部实参变量的实际存储值,计算平方后直接写回原内存地址,完全符合按引用传递修改外部变量的逻辑,所以运行正常。

第二段代码的错误点

void sqrNum(int *x){
    int temp, *y;
    temp = *x;
    *x = *y;
    temp = (*y )* (*y);
    return;
}

这段代码存在两个致命问题,完全不可能正常运行:

  1. 野指针非法访问:你定义了指针变量y但没有给它赋值,y存储的是随机的无效内存地址,直接解引用*y属于未定义行为,轻则读取到无意义的垃圾值,重则直接触发段错误导致程序崩溃。
  2. 逻辑完全错位:即使假设y是合法指针,你的代码逻辑也完全不对:你先把原数值存到临时变量temp后,直接用*y的未知值覆盖了*x的原有值,最后就算算出了*y的平方也只是存在局部变量temp里,函数结束后temp直接销毁,完全没有写回给*x,根本不可能把正确结果传递给外部。

如果想借助临时变量实现平方功能,正确的写法参考如下:

void sqrNum(int *x){
    int temp = *x;
    temp *= temp;
    *x = temp;
    return;
}

内容的提问来源于stack exchange,提问作者JuzChoco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 23:42:03