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

C语言twoSum函数运行报signed integer overflow错误如何处理

问题排查与修复方案

认知错误确认

你的认知确实存在问题:

认为nums数组元素都为正整数、不需要做溢出检测

LeetCode两数之和题目未限定输入元素为正整数,报错信息中两个负数相加溢出已经说明输入存在负数元素,且你代码的前置逻辑错误导致读取了未初始化的垃圾值,才会出现异常的求和溢出。

核心错误排查

  • 数组越界导致读取垃圾值

    count_elem初始值为0,符合筛选条件时你先执行count_elem +=1再赋值,会导致working_array[0]永远是未初始化的内存垃圾,报错中出现的-1094795586就是典型的野值,这是触发溢出的直接原因。
  • 指针操作错误

    returnSize是输出参数指针,你直接修改指针本身returnSize = sizeof(int)*2是完全错误的,应该修改指针指向的内容:*returnSize = 2,否则调用方无法拿到正确的返回数组长度。
  • 筛选逻辑完全错误

    未限定输入为正整数的前提下,大于target的元素也可能参与求和:例如target=5,nums=[6,-1],6大于target但和-1求和正好符合要求,你的筛选逻辑会直接漏掉这类合法解。
  • 双循环逻辑不符合题目要求

    两数之和题目要求返回原始数组的下标,你当前返回的是元素值,且未限制i != j,会出现同一个元素被使用两次的错误。

溢出问题的正确规避方案

即使输入合法,两int相加确实可能出现溢出,不需要做复杂的溢出检测,只需把加法判断改成减法即可:
把原来的

if( (working_array[i]+working_array[j]) == target)

修改为

if( working_array[i] == target - working_array[j] )

减法操作不会触发两数相加的上下溢问题,完全规避溢出风险。

核心修复点

  1. 修正数组赋值逻辑,避免越界:
if(nums[i] < target){
    working_array[count_elem] = nums[i];            
    count_elem += 1;
}
  1. 修正returnSize赋值:
*returnSize = 2;
  1. 建议删除不必要的筛选逻辑,避免漏掉合法解。
  2. 双循环增加i != j的判断,同时存储原始下标而非元素值(符合题目要求)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:24:02