C++中使用Void和指针交换数组的代码错误排查请求
问题分析与修复方案
首先看你的代码,核心问题出在swap函数的数组索引使用上,另外还有一些小细节可以优化,让我一步步给你拆解:
主要错误点
- 数组越界访问:在
swap函数的循环里,你用了SIZE作为数组下标(array1[SIZE]),但数组的合法下标范围是0到SIZE-1(因为SIZE=5,所以下标是0-4)。访问array1[5]属于越界操作,会触发未定义行为——程序可能崩溃、输出乱码或者出现其他奇怪的结果,这是导致程序无法正常运行的根本原因。 - 硬编码的循环条件:
showValues和swap里的循环都写了i < 5,如果以后修改SIZE的值,这些地方都要手动改,不如直接用SIZE常量,让代码更灵活。
修正后的完整代码
#include <iostream> #include <iomanip> using namespace std; const int SIZE = 5; void showValues(int[], int[]); void swapArrays(int[], int[]); // 换个名字避免和std::swap冲突(可选,但更安全) int main() { int array1[SIZE] = {10,20,30,40,50}; int array2[SIZE] = {60,70,80,90,100}; cout << "=== 交换前 ===" << endl; showValues(array1, array2); swapArrays(array1, array2); cout << "\n=== 交换后 ===" << endl; showValues(array1, array2); return 0; } void showValues(int array1[], int array2[]){ cout << " Array 1 is: "; for (int i = 0; i < SIZE; ++i) { // 用SIZE代替硬编码的5 cout << array1[i] << " "; } cout << "\n Array 2 is: "; for (int i = 0; i < SIZE; ++i) { // 同上 cout << array2[i] << " "; } cout << endl; } void swapArrays(int array1[], int array2[]) { int temp; for(int i = 0; i < SIZE; ++i) { temp = array1[i]; // 用循环变量i作为下标,访问合法的数组元素 array1[i] = array2[i]; array2[i] = temp; } }
代码修改说明
- 修复数组越界:把
swap函数里的array1[SIZE]改成array1[i],array2[SIZE]改成array2[i],这样每次循环都会交换两个数组对应位置的元素。 - 替换硬编码:所有循环条件里的
5都换成SIZE,增强代码的可维护性。 - 优化函数命名:把自定义的
swap改成swapArrays,因为你用了using namespace std;,标准库的std::swap可能和你的自定义函数产生命名冲突(虽然这里参数不同是重载,但换名字更清晰)。 - 调整输出逻辑:把交换后的输出放到
main函数里调用showValues,让swapArrays只负责交换逻辑,单一职责更清晰。
运行结果
=== 交换前 === Array 1 is: 10 20 30 40 50 Array 2 is: 60 70 80 90 100 === 交换后 === Array 1 is: 60 70 80 90 100 Array 2 is: 10 20 30 40 50
这样修改后,程序就能正常运行,正确交换两个数组的所有元素啦。
内容的提问来源于stack exchange,提问作者ian moone
相关产品推荐
相关产品推荐

