LeetCode数组拼接代码出现heap-buffer-overflow错误求排查
问题分析与解决:数组拼接题的堆溢出错误
题目要求
给定长度为n的整数数组nums,需创建长度为2n的数组ans,满足0<=i<n(0索引)时,ans[i] == nums[i]且ans[i+n] == nums[i],即ans是两个nums数组的拼接。示例:输入nums = [1,2,1],输出[1,2,1,1,2,1]。
错误代码
int* getConcatenation(int* nums, int numsSize, int* returnSize){ *returnSize = numsSize*2; int* ans = malloc(numsSize * 2 * sizeof(int)); for(int i=0; i<numsSize*2; i++){ ans[i] = nums[i]; ans[i + numsSize] = nums[i]; } return ans; }
错误原因
- 越界访问nums数组:循环条件是
i < numsSize*2,但nums的有效索引范围仅为0到numsSize-1。当i >= numsSize时,nums[i]会访问超出nums内存范围的区域,直接触发heap-buffer-overflow。 - 越界写入ans数组:当
i达到numsSize时,i + numsSize = 2*numsSize,而ans的长度是2*numsSize,最大有效索引为2*numsSize-1,此时写入ans[2*numsSize]会越界修改堆内存,同样引发溢出错误。
修正后的代码
int* getConcatenation(int* nums, int numsSize, int* returnSize){ *returnSize = numsSize * 2; int* ans = malloc(numsSize * 2 * sizeof(int)); if (ans == NULL) { *returnSize = 0; return NULL; } // 一次循环完成两次赋值,避免重复遍历 for (int i = 0; i < numsSize; i++) { ans[i] = nums[i]; ans[i + numsSize] = nums[i]; } return ans; }
修正说明
- 把循环次数改为
numsSize,确保nums[i]始终访问有效索引。 - 每次循环同时给
ans的前半段(ans[i])和后半段(ans[i+numsSize])赋值,逻辑简洁且不会越界。 - 增加
malloc失败的判断,避免空指针操作,提升代码健壮性。
内容的提问来源于stack exchange,提问作者Aryant Kumar
相关产品推荐
相关产品推荐

