动态分配的数组和 HEAP 已损坏
Dynamically allocated arrays and HEAP corrupted
我正在尝试编写一个程序,将输入作为动态数组并将它们从低到高排序,然后从高到低显示。但是,我收到一个调试错误,指出“检测到堆损坏:在 0x010CE3E8 处的正常块 (#182) 之后。
CRT 检测到应用程序在堆缓冲区结束后写入内存。"
嗯,程序构建成功,运行s。但是,当我尝试退出该程序时,它需要很长时间并且我收到错误消息。
void insert_Array(int Array1[], int array_size)
{
for (int counter = 0; counter < array_size; ++counter)
{
cout << " Please enter the " << counter << " number : ";
cin >> Array1[counter];
}
return;
}
void swap(int* a, int* b)
{
int holder = *a;
*a = *b;
*b = holder;
}
void sort_Array(int Array1[], int array_size)
{
int lowestNum_index;
for (int counter1 = 0; counter1 < array_size; ++counter1)
{
for (int counter2 = counter1; counter2 < array_size; ++counter2)
{
if (Array1[counter2] < Array1[counter2 + 1])
lowestNum_index = counter2;
else
lowestNum_index = counter2 + 1;
}
swap(Array1[counter1], Array1[lowestNum_index]);
}
return;
}
主要功能
int* npointer = new int[nNumbers];
insert_Array(npointer, nNumbers);
sort_Array(npointer, nNumbers);
cout << " The number you desired is " << nNumbers << endl;
cout << " The numbers in the array from high to low are ";
for (int i = 0; i < nNumbers; ++i)
{
cout << *(npointer + nNumbers - i) << " ";
}
cout << endl;
delete [] npointer;
当我 运行 时,程序成功地将我给出的数字从高到低排序。
检测到堆损坏:在 0x010CE3E8 处的正常块 (#182) 之后。
CRT 检测到应用程序在堆缓冲区结束后写入内存。
通常在进行这种嵌套循环时,内循环设置为从外循环 + 1 开始。这样您就不会以这样的值结束 Array1[counter2 + 1]
从而导致非法在循环的最后一次迭代中超出数组边界的内存访问。
即使修复了这个问题,排序逻辑也不正确。您正在尝试做的被称为选择排序,您将数组的每个元素与 n^2 时间复杂度中的其余元素进行比较。您必须为外循环的每次迭代获取 lowestNum_index
,而不是整个数组。下面是我将如何进行选择排序。
void sort_Array(int Array[], int array_size)
{
for (int i = 0; i < array_size; ++i)
{
int lowestIdx = i; // <-- always starts at i
for (int j = i + 1; j < array_size; ++j)
if (Array[j] < Array[i])
lowestIdx = j;
swap(&Array[lowestIdx], &Array[i]); // <--- note the & symbol to pass by reference
}
}
由于您的交换函数接受两个指针,使用 Array[i]
将导致非法内存访问,因为 []
运算符将数组取消引用为 i
处的值,您必须使用&
运算符获取该位置的地址。即
Array[i] = *(Array + i)
&Array[i] = Array + i // <--- essentially cancels the dereference operator
编辑: 在每个外循环上初始化 lowestIdx = i
我正在尝试编写一个程序,将输入作为动态数组并将它们从低到高排序,然后从高到低显示。但是,我收到一个调试错误,指出“检测到堆损坏:在 0x010CE3E8 处的正常块 (#182) 之后。 CRT 检测到应用程序在堆缓冲区结束后写入内存。"
嗯,程序构建成功,运行s。但是,当我尝试退出该程序时,它需要很长时间并且我收到错误消息。
void insert_Array(int Array1[], int array_size)
{
for (int counter = 0; counter < array_size; ++counter)
{
cout << " Please enter the " << counter << " number : ";
cin >> Array1[counter];
}
return;
}
void swap(int* a, int* b)
{
int holder = *a;
*a = *b;
*b = holder;
}
void sort_Array(int Array1[], int array_size)
{
int lowestNum_index;
for (int counter1 = 0; counter1 < array_size; ++counter1)
{
for (int counter2 = counter1; counter2 < array_size; ++counter2)
{
if (Array1[counter2] < Array1[counter2 + 1])
lowestNum_index = counter2;
else
lowestNum_index = counter2 + 1;
}
swap(Array1[counter1], Array1[lowestNum_index]);
}
return;
}
主要功能
int* npointer = new int[nNumbers];
insert_Array(npointer, nNumbers);
sort_Array(npointer, nNumbers);
cout << " The number you desired is " << nNumbers << endl;
cout << " The numbers in the array from high to low are ";
for (int i = 0; i < nNumbers; ++i)
{
cout << *(npointer + nNumbers - i) << " ";
}
cout << endl;
delete [] npointer;
当我 运行 时,程序成功地将我给出的数字从高到低排序。
检测到堆损坏:在 0x010CE3E8 处的正常块 (#182) 之后。 CRT 检测到应用程序在堆缓冲区结束后写入内存。
通常在进行这种嵌套循环时,内循环设置为从外循环 + 1 开始。这样您就不会以这样的值结束 Array1[counter2 + 1]
从而导致非法在循环的最后一次迭代中超出数组边界的内存访问。
即使修复了这个问题,排序逻辑也不正确。您正在尝试做的被称为选择排序,您将数组的每个元素与 n^2 时间复杂度中的其余元素进行比较。您必须为外循环的每次迭代获取 lowestNum_index
,而不是整个数组。下面是我将如何进行选择排序。
void sort_Array(int Array[], int array_size)
{
for (int i = 0; i < array_size; ++i)
{
int lowestIdx = i; // <-- always starts at i
for (int j = i + 1; j < array_size; ++j)
if (Array[j] < Array[i])
lowestIdx = j;
swap(&Array[lowestIdx], &Array[i]); // <--- note the & symbol to pass by reference
}
}
由于您的交换函数接受两个指针,使用 Array[i]
将导致非法内存访问,因为 []
运算符将数组取消引用为 i
处的值,您必须使用&
运算符获取该位置的地址。即
Array[i] = *(Array + i)
&Array[i] = Array + i // <--- essentially cancels the dereference operator
编辑: 在每个外循环上初始化 lowestIdx = i