为什么我的阵列部分通过写入访问冲突?

时间:2018-02-03 22:17:12

标签: c++ arrays

已更新为复制/粘贴并运行。我的坏。

我知道我可能会得到整个“这个问题已被问到”但我花了一些时间寻找并找不到匹配的问题。很有可能我只是不知道在正确的地方看。

当我调用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();
}

2 个答案:

答案 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>];

阵列:http://en.cppreference.com/w/cpp/container/array

向量:http://en.cppreference.com/w/cpp/container/vector

答案 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.只有在极少数情况下,您才能多次调用它,在这种情况下,有比srandrand更好的选项。

只需拨打srand顶部的main,即可确定您需要srand(0),因为这样会在给定的计算机上生成完全相同的数字。它非常适合测试,但如果你想每次都有不同的序列,那就不太好了。典型的用途是srand(time(NULL))根据不断变化的时间流量为发电机播种。这仍然不是那么好,但对于大多数使用rand的情况来说已经足够了。