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

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;
}

错误原因

  1. 越界访问nums数组:循环条件是i < numsSize*2,但nums的有效索引范围仅为0到numsSize-1。当i >= numsSize时,nums[i]会访问超出nums内存范围的区域,直接触发heap-buffer-overflow。
  2. 越界写入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:12:18