-1

你好我有一个生成数组方法:

void generateArray(double *data, int count) {
    for (int i = 0; i < count; i++)
        data[i] = rand() / ((rand() + rand()) / 2.0 + 1);
}

我有以下主要

int main(void) {

    double *arr;
    generateArray(arr,40000);

    cout << arr[0];


    return 0;
}

它说在设置其值之前使用 arr 为什么?为什么不生成数组填充呢?我该如何解决这个问题?

4

3 回答 3

3
double *arr;

这只会给你一个指针。您还没有分配任何doubles 来指向它,并且您还没有初始化指针以实际指向任何地方。在这里,您会发现声明一个适当大小的数组更容易:

double arr[40000];

像您当前所做的那样传递arr将执行数组到指针的转换,它将按预期工作。

然而,一个 40000 s 的数组double在堆栈上是一个相当大的对象。您可能更喜欢使用 动态分配您的数组double* arr = new double[40000];,但您需要确保delete[] arr;在完成后这样做以避免内存泄漏。相反,您可能更喜欢使用std::vector

std::vector<double> arr(40000);

只需将第一个参数更改generateArray为 a std::vector<double>&

于 2013-04-24T13:02:55.063 回答
1

您只需给它一个指针,但从不为数组分配任何内存。您想要 adata = new double[count]在您的 generateArray 中,或者简单地预先分配它double arr[40000](或者更好的是,使用 a vector)。

这将是更可取的:

std::vector<double> generateArray(int count) {
    std::vector<double> data(count);
    for (int i = 0; i < count; i++)
        data[i] = rand() / ((rand() + rand()) / 2.0 + 1);
    }
    return data;
}

如果您需要以某种方式取回数组数据,vector保证在内部使用一个连续的数组,可以通过&v[0]to访问&v[v.size()-1]

于 2013-04-24T13:02:47.250 回答
0

您永远不会使用大小初始化数组。你需要做

arr = new double[count];

函数内部。如下所示。完成后别忘了delete[] arr;做!

void generateArray(double *data, int count) {
    arr = new double[count];
    for (int i = 0; i < count; i++)
        data[i] = rand() / ((rand() + rand()) / 2.0 + 1);
}

另一种选择是double *arr = new double[40000]在函数之外进行。

于 2013-04-24T13:02:50.483 回答