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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:54:02