已更新为复制/粘贴并运行。我的坏。
我知道我可能会得到整个“这个问题已被问到”但我花了一些时间寻找并找不到匹配的问题。很有可能我只是不知道在正确的地方看。
当我调用InitSortedArray()时,它会在抛出异常之前运行一个看似随机数量的元素:写入访问冲突。每次我运行它时会停在不同的元素编号。有任何想法吗?
#include <array>
#include <iostream>
using namespace std;
int * toSort;
const int SIZE = 100000;
void InitSortedArray()
{
srand(0);
toSort[0] = rand() % 5;
cout << toSort[0];
for (int i = 1; i < SIZE - 1; i++)
{
srand(0);
toSort[i] = toSort[i - 1] + rand() % 5;
cout << toSort[i] << endl;
}
}
void Search()
{
toSort[SIZE];
InitSortedArray();
}
int main()
{
Search();
}
答案 0 :(得分:1)
看起来你正在使用指向随机空间的未初始化指针,并尝试在其中存储元素和访问元素。此外,你在这里包含“数组”没有任何意义。我相信你想要做的是初始化你的toSort数组,以实际指向你打算指向它的一段内存:
int toSort[SIZE];
而不是
int * toSort;
如果您正在寻找使用STL阵列(可能非常值得推荐),那么您需要明确使用它:
std::array<int, SIZE> toSort;
使用STL的好处是它可以解决许多内存访问问题,例如内存访问冲突。 STL的另一个有用的东西是vector:
#include <vector>
std::vector<int> toSort;
然后:(这会在向量的后面添加一个项目)
toSort.push_back(<some number>);
并访问:
int somethingElse = toSort[<index number>];
答案 1 :(得分:1)
int * toSort;
分配一个指向尚未分配给它的数据的指针。没有分配数据。你可以
int * toSort = new int[100000];
但是这会获得一些你不需要的内存管理工作。每当您迟早使用new[]
时,您必须delete[]
。而是使用
const int SIZE = 100000; // place first so we can use it below
int toSort[SIZE];
或更现代的
const int SIZE = 100000; // place first so we can use it below
std::array<int, SIZE> toSort;
声明一个数组。
toSort[100000];
Search
中的没有任何帮助(实际上有害,因为它通过访问toSort
的范围之外来调用Undefined Behaviour并且应该被移除。
额外的东西:
srand
reseeds and restarts the random number generator.只有在极少数情况下,您才能多次调用它,在这种情况下,有比srand
和rand
更好的选项。
只需拨打srand
顶部的main
,即可确定您需要srand(0)
,因为这样会在给定的计算机上生成完全相同的数字。它非常适合测试,但如果你想每次都有不同的序列,那就不太好了。典型的用途是srand(time(NULL))
根据不断变化的时间流量为发电机播种。这仍然不是那么好,但对于大多数使用rand
的情况来说已经足够了。