C++代码数组未修改问题及参数传值/传引用疑问
问题分析与解答
1. 数组无变化的根本原因
你的代码里有个致命的低级错误:循环变量i没有初始化!
在find函数的循环中,int i;只声明了变量但没有赋值,局部变量默认不会被初始化,i的值是随机的垃圾值。大概率这个随机值一开始就大于等于size(比如你的数组长度是6,i可能随机成10),导致循环体一次都没执行。find函数根本没找到你要修改的arr[1]=2,自然不会把它改成-1,数组看起来就没变化。
修复方法很简单,给循环变量初始化:
for (int i = 0; i < size; i++) { // 给i初始化为0 // ... 你的查找逻辑 }
2. seek参数按值传递 vs 引用传递的区别
先明确两个传递方式的核心差异:
- 引用传递:函数接收的是外部变量的「别名」,函数内部对
seek的任何修改都会直接影响外部的原变量。不过在你的场景里,seek是用来指定要查找的目标值,本来不需要修改它,所以引用传递在这里其实没必要——但也不会有问题。 - 值传递:函数接收的是外部变量的「副本」,函数内部修改
seek的副本,完全不会影响外部的原变量。如果你的find函数不需要修改seek本身,值传递才是更合理的选择(语义更清晰:函数不会修改这个参数)。
3. 值传递时报错0xC0000005的原因
0xC0000005是Windows系统下的访问违规错误,本质是程序试图访问不属于它的内存区域。结合你的代码,主要原因还是循环变量i未初始化的问题:
当seek改成值传递后,循环里的i依然是随机垃圾值,大概率会远远超过数组的size。比如i随机成1000,这时访问arr[i]就会直接越界访问数组之外的内存,触发系统的内存保护机制,抛出访问违规错误。
另外还要注意:如果find函数在循环结束后没有找到目标元素,你必须确保返回一个有效的引用(比如返回arr[0]或者提前处理)。如果函数走到结尾没有返回值,那也是未定义行为,可能会导致各种奇怪的错误,包括访问违规。
内容的提问来源于stack exchange,提问作者shir k
相关产品推荐
相关产品推荐

