动态分配的数组和 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