我正在尝试将 C 中的接口与foo
具有以下类型的函数一起使用
void foo(double x[]);
但是,我要传递给此函数的数组x
对于堆栈内存来说太大了。有没有办法将动态数组传递给foo
,或增加堆栈内存的大小?
在函数签名中,double x[]
等价于double *x
. 无论如何,您都在传递一个指针,而指针并不关心它是指向堆上的对象还是堆栈上的对象。只需以任何合适的方式分配您的数组(例如,malloc
如果它对于堆栈来说太大,则使用)并将结果指针传递给foo
.
您的功能将正常工作。数组参数不会复制到堆栈中,它们总是作为指针传递。你写的函数声明实际上等价于:
void foo(double *x);
使用 malloc 在堆上分配数组。问题不在于功能。相反,问题在于您分配传递给函数的数组的位置。只要您在堆上分配数组,就不会溢出堆栈。
当您将数组传递给函数时,它会退化为指向基类型的指针,指向第一个元素。
它永远不会传递堆栈上的所有值。
当一个函数期望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;
}