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