C++指针与数组求助:reverseArray函数在main中运行崩溃
解决reverseArray函数整合到main函数时的崩溃问题
嘿,我来帮你搞定这个问题!你说把reverseArray函数直接复制到main函数里程序就崩溃,这大概率是因为C++标准不允许在函数内部定义另一个函数(也就是嵌套函数)。虽然部分编译器有非标准的嵌套函数扩展,但这种写法很容易触发内存访问错误、栈溢出等问题,直接导致程序崩溃——这就是你遇到的核心问题。
正确的代码结构:函数放在main外部
按照C++标准写法,我们需要把reverseArray和printArray的实现放在main函数外面,通过函数原型提前声明即可。这里给你补全完整的可运行代码:
#include <iostream> using namespace std; // 函数原型声明 void reverseArray(int*, int); void printArray(int*, int); int main() { int size; cout << "请输入数组大小: "; cin >> size; // 动态分配数组内存 int* arr = new int[size]; cout << "请输入" << size << "个整数: "; for (int i = 0; i < size; ++i) { cin >> arr[i]; } cout << "原数组: "; printArray(arr, size); // 调用反转函数 reverseArray(arr, size); cout << "反转后的数组: "; printArray(arr, size); // 释放动态分配的内存,避免内存泄漏 delete[] arr; return 0; } // reverseArray函数实现 void reverseArray(int* arr, int size) { for (int i = 0; i < size / 2; ++i) { // 交换首尾对应位置的元素 swap(arr[i], arr[size - 1 - i]); } } // printArray函数实现 void printArray(int* arr, int size) { for (int i = 0; i < size; ++i) { cout << arr[i] << " "; } cout << endl; }
如果想在main内封装反转逻辑:用Lambda表达式
要是你确实想把反转逻辑写在main函数内部,可以用C++11及以后支持的Lambda表达式,这是标准写法,不会触发崩溃:
#include <iostream> using namespace std; void printArray(int*, int); int main() { int size; cout << "请输入数组大小: "; cin >> size; int* arr = new int[size]; cout << "请输入" << size << "个整数: "; for (int i = 0; i < size; ++i) { cin >> arr[i]; } cout << "原数组: "; printArray(arr, size); // 用Lambda表达式实现反转逻辑,直接写在main内 auto reverseArray = [](int* arr, int size) { for (int i = 0; i < size / 2; ++i) { swap(arr[i], arr[size - 1 - i]); } }; reverseArray(arr, size); cout << "反转后的数组: "; printArray(arr, size); delete[] arr; return 0; } void printArray(int* arr, int size) { for (int i = 0; i < size; ++i) { cout << arr[i] << " "; } cout << endl; }
额外注意事项
- 动态分配的数组一定要用
delete[]释放,否则会造成内存泄漏; - 反转数组时用
size/2作为循环终止条件,避免重复交换同一个元素; - 如果你之前的
reverseArray函数本身有数组越界访问的逻辑错误,也可能导致崩溃,但最可能的原因还是嵌套函数的非标准写法。
内容的提问来源于stack exchange,提问作者DiabolicNick
相关产品推荐
相关产品推荐

