-1

我正在尝试将 C 中的接口与foo具有以下类型的函数一起使用

void foo(double x[]);

但是,我要传递给此函数的数组x对于堆栈内存来说太大了。有没有办法将动态数组传递给foo,或增加堆栈内存的大小?

4

5 回答 5

1

在函数签名中,double x[]等价于double *x. 无论如何,您都在传递一个指针,而指针并不关心它是指向堆上的对象还是堆栈上的对象。只需以任何合适的方式分配您的数组(例如,malloc如果它对于堆栈来说太大,则使用)并将结果指针传递给foo.

于 2013-10-31T22:28:52.220 回答
1

您的功能将正常工作。数组参数不会复制到堆栈中,它们总是作为指针传递。你写的函数声明实际上等价于:

void foo(double *x);
于 2013-10-31T22:29:08.043 回答
1

使用 malloc 在堆上分配数组。问题不在于功能。相反,问题在于您分配传递给函数的数组的位置。只要您在堆上分配数组,就不会溢出堆栈。

于 2013-10-31T22:29:10.983 回答
0

当您将数组传递给函数时,它会退化为指向基类型的指针,指向第一个元素。

它永远不会传递堆栈上的所有值。

于 2013-10-31T22:29:01.270 回答
0

当一个函数期望double []它时,它等价于double *因为数组衰减为指针。但是请注意,您的函数无法找出该数组的大小,因为它sizeof会返回指针的大小。您还应该传递大小:

void foo(double x[], int size) {
    ...
}

int main(void) {
    const int N = 10000;
    double *x = malloc(sizeof(double) * N);
    foo(x, N);
    free(x);    // don't forget to clean up
    return 0;
}
于 2013-10-31T22:32:08.423 回答