C++合并两个有序数组到vector仅输出1、2元素的问题排查
问题根因
你的归并算法逻辑本身是正确的,输出异常的核心原因是函数内通过sizeof计算数组长度的方式完全失效:
- C++语法规则中,数组作为函数形参标注为
int arr1[]时,会自动退化为指向数组首元素的指针(等价于int* arr1),此时在函数作用域内执行sizeof(arr1)拿到的是指针本身的内存大小(64位环境下为8字节),而非原数组的总字节长度。 - 按这个错误取值计算,你得到的
arr1size = sizeof(arr1)/sizeof(arr1[0])实际结果为8/4=2,同理arr2size也等于2,归并流程仅会处理两个数组的前2个元素,最终输出自然只有1、2两个值。
修复方案
最通用的修复方式是将数组长度作为独立参数显式传入merge函数,避免依赖函数内的sizeof计算长度,修改后的核心代码如下:
- 重写merge函数签名,增加两个长度参数,将原有循环判断边界替换为传入的实际长度
vector<int> merge(int arr1[], int size1, int arr2[], int size2) { vector<int> arr3; int i = 0, j = 0; while(i < size1 && j < size2) { // 原有归并逻辑完全保留,无需修改 if(arr1[i] <= arr2[j]) { arr3.push_back(arr1[i]); i++; } else { arr3.push_back(arr2[j]); j++; } } while(i < size1) { arr3.push_back(arr1[i]); i++; } while(j < size2) { arr3.push_back(arr2[j]); j++; } return arr3; }
- 在main函数中计算数组真实长度(main作用域内的数组不会发生指针退化,可正常通过
sizeof计算长度),调用merge时传入对应参数:
int main() { int arr1[] = {1, 3, 5, 7}; int arr2[] = {2, 4, 6, 8}; int size1 = sizeof(arr1) / sizeof(arr1[0]); int size2 = sizeof(arr2) / sizeof(arr2[0]); vector<int> arr3 = merge(arr1, size1, arr2, size2); for(int i = 0; i < arr3.size(); i++) { cout << arr3[i] << endl; } return 0; }
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

