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
相关产品推荐
相关产品推荐

