C语言编写数组两数和判断函数指针传值异常问题求解
错误原因
你代码的核心问题出在命中符合条件的数对时的赋值顺序,以及遍历逻辑直接修改入参值两个地方:
- 赋值顺序错误:命中数对后你先修改了
*n的值,导致第二个数的下标计算完全错误
你当前命中后的执行代码是:
执行第一行*n = arr[i]; *key = arr[*n-1];*n = arr[i]之后,*n已经不再是之前用来定位数组末尾元素的长度值,此时*n-1已经不是你要取的第二个元素的下标,而是用第一个结果值作为下标去数组取值,自然得到错误结果。
以你给出的测试用例为例:命中时*n初始值为3,对应数组下标*n-1=2的元素是2,arr[i]为1,你先把*n赋值为1,后续arr[*n-1]就变成了arr[0]的1,最终*key被错误赋值为1。 - 遍历逻辑直接修改入参
*n:你在循环中直接修改*n的值,会直接篡改遍历依赖的数组长度参数,本身就属于逻辑隐患。
修复方案
遍历过程不要直接修改入参值,用临时变量存储遍历用的数组长度和原始key值,命中数对后先确认两个值再赋值给出参,如果你预期*n存更大的那个值、*key存更小的那个值,调整赋值顺序即可:
int ex5(int* arr, int* n, int* key) { // 用临时变量存储原始入参值,避免遍历过程修改入参 int len = *n; int origin_key = *key; for (int j = len - 1; j > 0; j--) { for (int i = 0; i < j; i++) { if (arr[j] + arr[i] < origin_key) { // 按你预期的顺序赋值给出参 *n = arr[j]; *key = arr[i]; return 1; } } } *n = -1; *key = -1; return 0; }
用你提供的测试用例运行修复后的代码,会输出1 2 1,符合你的预期结果。
内容的提问来源于stack exchange,提问作者YahavB
相关产品推荐
相关产品推荐

