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

C语言不创建新变量合并两数组时算法结果异常排查

问题定位与修复方案

核心问题1:数组越界访问导致内存污染

你定义的firstArray在栈上仅分配了5个int的存储空间,但合并时需要存放10个元素。当你向firstArray[5]及以后的位置写入数据时,属于越界访问,会覆盖栈上相邻的secondArray的内存(栈上变量通常按声明顺序连续分配),导致secondArray的原始数据被篡改,这就是你看到secondArray值意外变化的根本原因。

核心问题2:合并逻辑不完整

当前的mergeArray函数仅处理了两个数组都有剩余元素的情况,当其中一个数组的元素先处理完后,剩余的元素没有被复制到合并后的数组中。另外,当两个元素相等时,你直接跳过了元素的写入,这会导致合并结果丢失重复元素(如果有)。

修复后的代码

步骤1:确保firstArray有足够的存储空间

修改firstArray的声明,直接指定足够的大小(比如10),或者使用动态内存分配(如果允许的话)。这里我们用静态分配的方式:

#include <stdio.h>

void printArray(int array[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d, ", array[i]);
    }
    printf("\n");
}

void mergeArray(int *firstArray, int secondArray[], int firstSize, int secondSize) {
    int firstIndex = firstSize - 1;
    int secondIndex = secondSize - 1;
    int mergeIndex = firstSize + secondSize - 1;

    // 从后往前合并两个数组的元素
    while (firstIndex >= 0 && secondIndex >= 0) {
        if (firstArray[firstIndex] > secondArray[secondIndex]) {
            firstArray[mergeIndex] = firstArray[firstIndex];
            firstIndex--;
        } else {
            // 包含相等的情况,保留元素
            firstArray[mergeIndex] = secondArray[secondIndex];
            secondIndex--;
        }
        mergeIndex--;       
    }

    // 处理secondArray剩余的元素
    while (secondIndex >= 0) {
        firstArray[mergeIndex] = secondArray[secondIndex];
        secondIndex--;
        mergeIndex--;
    }

    // firstArray剩余的元素已经在正确位置,无需处理
}

int main() {
    // 预留足够的存储空间
    int firstArray[10] = { 1, 5, 7, 9, 10 };
    int secondArray[] = { 2, 4, 6, 8, 12 };

    int firstSize = 5; // 明确原始元素数量,避免sizeof计算错误
    int secondSize = sizeof(secondArray) / sizeof(secondArray[0]);
    int mergeSize = firstSize + secondSize;

    printArray(firstArray, firstSize);
    printArray(secondArray, secondSize);

    mergeArray(firstArray, secondArray, firstSize, secondSize);
    printArray(firstArray, mergeSize);
    
    return 0;
}

修复后的输出

1, 5, 7, 9, 10, 
2, 4, 6, 8, 12, 
1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 

额外说明

  • 栈上数组的大小必须在编译时确定,如果你需要更灵活的空间,可以使用malloc动态分配firstArray的内存:
    int* firstArray = (int*)malloc((firstSize + secondSize) * sizeof(int));
    // 初始化原始元素
    firstArray[0] = 1; firstArray[1] =5; firstArray[2]=7; firstArray[3]=9; firstArray[4]=10;
    // 使用完后记得free(firstArray);
    
  • 从后往前合并的逻辑是正确的,因为原始数组都是升序排列,把较大的元素放到合并数组的末尾,最终可以得到升序的合并结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:19:52