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] )
减法操作不会触发两数相加的上下溢问题,完全规避溢出风险。
核心修复点
- 修正数组赋值逻辑,避免越界:
if(nums[i] < target){ working_array[count_elem] = nums[i]; count_elem += 1; }
- 修正returnSize赋值:
*returnSize = 2;
- 建议删除不必要的筛选逻辑,避免漏掉合法解。
- 双循环增加
i != j的判断,同时存储原始下标而非元素值(符合题目要求)。
内容的提问来源于stack exchange,提问作者bersi
相关产品推荐
相关产品推荐

