查找数组公共元素结果异常问题排查
问题分析与修复
你的代码核心问题是**result数组的内存越界**:
- 你初始化
int result[] {0};时,这个数组只分配了能容纳1个整数的内存空间。 - 当找到第2个及以后的公共元素时,
counter递增后写入result[counter],本质是在访问数组范围外的内存,这属于C++里的未定义行为,会导致输出随机的垃圾值(就是你看到的1 10 10这类奇怪数字)。
另外还有个潜在问题:如果输入数组存在重复元素,你的嵌套循环会重复添加同一个公共元素,不过你的测试数据里暂时没出现这种情况。
修复后的代码
#include <iostream> void common_elements(int array_1[], int array_2[]){ // 定义足够大的数组,匹配输入数组的最大可能长度 int result[10] = {0}; int counter{0}; for (int i{0}; i < 10; i++){ for (int j{0}; j < 10; j++){ if (array_2[i] == array_1[j]){ // 检查元素是否已存在,避免重复添加 bool is_duplicate = false; for (int k = 0; k < counter; k++) { if (result[k] == array_1[j]) { is_duplicate = true; break; } } if (!is_duplicate) { result[counter] = array_1[j]; counter++; } break; // 找到匹配后跳出内层循环,减少无效遍历 } } } if (counter == 0) { std::cout << "There are 0 common elements"; } else { std::cout << "There are " << counter << " common elements they are : "; for (int k{0}; k < counter; k++){ std::cout << result[k] << " "; } } } int main(){ int data1[] {1,2,4,5,9,3,6,7,44,55}; int data2[] {11,2,44,45,49,43,46,47,55,88}; common_elements(data1,data2); return 0; }
关键修复点
- 调整
result数组大小:设为10(和输入数组长度一致),确保能容纳所有可能的公共元素。 - 新增重复检查逻辑:避免同一个公共元素被多次写入结果数组。
- 优化循环效率:找到匹配元素后立即跳出内层循环,减少不必要的遍历。
运行修复后的代码,就能得到预期的2 44 55输出了。
内容的提问来源于stack exchange,提问作者Calimero
相关产品推荐
相关产品推荐

