C++全局动态数组排序函数异常及内存释放问题求助
问题分析与修复
核心问题1:数组内存分配时机错误
你在全局作用域直接用array_size初始化动态数组,但此时array_size还未被用户输入赋值(全局int变量默认初始值为0),导致分配的数组大小为0,后续输入元素时必然越界访问内存,触发未定义行为(比如元素数量超过2时崩溃)。
修复方案:把数组分配放到create_array_cmd函数里,等用户输入array_size之后再执行内存分配:
int array_size; int* array = nullptr; // 先初始化为空指针 void create_array_cmd() { cout << "Please input your desired array size: "; cin >> array_size; array = new int[array_size]; // 输入size后再分配内存 cout << "Please key-in the numeric characters you wish to save: " << endl; for (int i = 0; i < array_size; i++) { cout << "Array [" << i + 1 << "]: "; cin >> array[i]; // 无需::,全局变量无局部同名遮蔽 } }
核心问题2:排序函数逻辑彻底错误
你当前的array_sort_cmd嵌套了两层for循环,还在循环内部修改循环变量j,直接导致死循环或排序逻辑混乱,程序执行到这里就卡住。这是把插入排序的写法完全搞错了,插入排序只需要一层外层循环,内层用while往前比较即可。
修复后的排序函数(标准插入排序实现):
void array_sort_cmd() { cout << "The sorted values are: " << endl; // 插入排序正确实现 for (int i = 1; i < array_size; i++) { int k = array[i]; // 当前要插入的元素 int j = i - 1; // 往前查找比k大的元素,逐个后移 while (j >= 0 && array[j] > k) { array[j + 1] = array[j]; j--; } array[j + 1] = k; // 插入到正确位置 } for (int i = 0; i < array_size; i++) { cout << array[i] << " "; } cout << endl; }
核心问题3:delete语法错误
释放动态数组的正确语法是delete[] array;,你写的delete array[];是错误的,编译器会直接报错。另外要在释放前判断指针是否为空,避免空指针错误。
修复后的main函数:
int main() { create_array_cmd(); print_values_cmd(); array_sort_cmd(); if (array != nullptr) { delete[] array; // 正确释放动态数组 array = nullptr; // 防止野指针 } return 0; }
完整修正代码
#include <iostream> using namespace std; int array_size; int* array = nullptr; void create_array_cmd() { cout << "Please input your desired array size: "; cin >> array_size; array = new int[array_size]; cout << "Please key-in the numeric characters you wish to save: " << endl; for (int i = 0; i < array_size; i++) { cout << "Array [" << i + 1 << "]: "; cin >> array[i]; } } void print_values_cmd() { cout << "Here are the values you entered: " << endl; for (int i = 0; i < array_size; i++) { cout << array[i] << " "; } cout << endl; } void array_sort_cmd() { cout << "The sorted values are: " << endl; for (int i = 1; i < array_size; i++) { int k = array[i]; int j = i - 1; while (j >= 0 && array[j] > k) { array[j + 1] = array[j]; j--; } array[j + 1] = k; } for (int i = 0; i < array_size; i++) { cout << array[i] << " "; } cout << endl; } int main() { create_array_cmd(); print_values_cmd(); array_sort_cmd(); if (array != nullptr) { delete[] array; array = nullptr; } return 0; }
内容的提问来源于stack exchange,提问作者Eryck Louisze Flores
相关产品推荐
相关产品推荐

