合并两个有序数组时出现“使用未初始化内存”警告的问题排查
合并有序数组的错误排查与修复
问题分析
你的代码存在多处逻辑错误,直接导致了未初始化内存访问警告和输出异常:
- 数组越界访问:第一个
while循环条件i <= n && j <= m错误,数组下标范围是0到n-1/m-1,当i == n或j == m时,访问a[i]或b[j]会读取未初始化的内存,触发警告。 - 剩余元素合并逻辑错误:处理剩余元素的两个
while循环内部嵌套了错误的for循环,既没有递增i/j导致死循环,也没有正确填充c数组的后续位置。 - 输出逻辑错误:最后输出时,循环内始终访问
c[k]而非当前循环变量对应的元素,且循环条件未覆盖所有合并后的元素。
修复后的代码
#include <iostream> int main() { int n, m; int a[100], b[100], c[201]; std::cin >> n; for (int i = 0; i < n; i++) { std::cin >> a[i]; } std::cin >> m; for (int i = 0; i < m; i++) { std::cin >> b[i]; } int i = 0, j = 0, k = 0; // 修正循环边界,避免越界访问未初始化内存 while (i < n && j < m) { if (a[i] > b[j]) { c[k] = a[i]; i++; } else { c[k] = b[j]; j++; } k++; } // 处理a数组剩余元素,逐个填充到c while (i < n) { c[k] = a[i]; i++; k++; } // 处理b数组剩余元素,逐个填充到c while (j < m) { c[k] = b[j]; j++; k++; } // 正确遍历输出所有合并后的元素 for (int p = 0; p < k; p++) { std::cout << c[p]; // 可选:添加空格分隔元素,提升可读性 // std::cout << " "; } std::cout << std::endl; return 0; }
关键修复点说明
- 修正循环边界:将第一个
while的条件改为i < n && j < m,确保只访问数组中已初始化的有效元素。 - 重构剩余元素填充逻辑:去掉嵌套的错误
for循环,改为逐个将剩余元素放入c数组,同时递增i/j和k,避免死循环并完成正确填充。 - 修正输出逻辑:输出时使用循环变量
p访问c[p],确保遍历所有合并后的元素。
内容的提问来源于stack exchange,提问作者Karlson
相关产品推荐
相关产品推荐

