访问数组、二进制堆树之外的内存

Accessing memory outside of array, binary heap tree

本文关键字:内存 数组 二进制 访问      更新时间:2023-10-16

对于一个类,我给出了一个从命令行获取输入并使用输入创建堆树的赋值。数字是从命令行读取的。

例如:

样本输入:

/堆2 9 7 6 5 8

样本输出:

9 6 8 2 5 7

我有那么多工作要做,而且似乎每一个6个或更少数字的输入都很好。当一个输入是7个或更多像这样的数字时:

样本输入:

/堆3 10 8 7 5 9 6

我的输出:

32767 10 9 6 8 7 5

出了问题。很明显,我要么在程序中使用了太多内存,得到了一个"垃圾"数字,要么我正在访问数组之外的内存,这会导致另一个"废物"数字。我一直在想可能出了什么问题,但我只是不确定。如有任何帮助,我们将不胜感激。

如果你有问题或需要澄清,请毫不犹豫地询问。

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
void heap(int *array, int n);
int main(int argc, char* argv[]){
    int array[argc+1];
    int length = argc+1;
    for(int i = 1; i < length-1; i++){
        array[i]=atoi(argv[i]);
    }
    array[0]= -1;
    cout << "unheapified array: ";
    for(int k = 1; k < length-1; k++){
        cout << array[k] << " ";
    }
    cout << endl;
    heap(array, length);
    cout << "heapified array: ";
    for(int k = 1; k < length-1; k++){
        cout << array[k] << " ";
    }
    cout << endl;
return 0;
}
void heap(int *array, int n){
    int i, v, j,k;
    bool heap;
    for(int i=(n/2); i>0; --i){
        k = i;
        v = array[k];
        heap = false;
        while(heap == false && (2*k) <= n-1){
            j = 2*k;
            if(j<n){
                if(array[j] < array[j+1])
                    j += 1;
            }
            if (v >= array[j])
                heap = true;
            else{
                array[k] = array[j];
                k = j;
            }
        }       
        array[k] = v;   
    }
}

这样修改heap函数:

    while(heap == false && (2*k) <= n-1){
        j = 2*k;
        if(j<n){
            assert((j+1)<n); // ADDED THIS
            if(array[j] < array[j+1])
                j += 1;
        }

您将看到assert跳闸。所以array[j+1]已经结束了。