为什么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; }
这段代码存在两个致命问题,完全不可能正常运行:
- 野指针非法访问:你定义了指针变量
y但没有给它赋值,y存储的是随机的无效内存地址,直接解引用*y属于未定义行为,轻则读取到无意义的垃圾值,重则直接触发段错误导致程序崩溃。 - 逻辑完全错位:即使假设
y是合法指针,你的代码逻辑也完全不对:你先把原数值存到临时变量temp后,直接用*y的未知值覆盖了*x的原有值,最后就算算出了*y的平方也只是存在局部变量temp里,函数结束后temp直接销毁,完全没有写回给*x,根本不可能把正确结果传递给外部。
如果想借助临时变量实现平方功能,正确的写法参考如下:
void sqrNum(int *x){ int temp = *x; temp *= temp; *x = temp; return; }
内容的提问来源于stack exchange,提问作者JuzChoco
相关产品推荐
相关产品推荐

