访问数组、二进制堆树之外的内存
Accessing memory outside of array, binary heap tree
对于一个类,我给出了一个从命令行获取输入并使用输入创建堆树的赋值。数字是从命令行读取的。
例如:
样本输入:
/堆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]
已经结束了。
相关文章:
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 使用无符号字符数组有效存储内存
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 为什么调用堆栈数组会导致内存泄漏
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 查找自动生成键并具有线性内存消耗的小型关联数组
- C++,为什么数组比矢量更快,使用更少的内存
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 当另一个数组是内存集时,内存集是否会更改数组长度?
- 动态分配字符数组的内存
- 将内存分配返回值强制转换为 TYPE 数组
- 销毁C++中动态分配的内存(数组对象)
- 给定特定内存地址的数组的动态内存分配
- 如何通过 malloc 为队列数组分配内存?
- 如何使用内存集清除字符数组
- 如何初始化所有元素为 0 的指针的二维动态内存数组
- 共享内存数组是否由 CreateFileMapping/MapViewOfFile 零初始化
- C++ 分配 struc 的内存数组
- 在CUDA中有效初始化共享内存数组