我想用C的一個接口,它具有以下類型將動態數組傳遞給需要類型double []的函數?
void foo(double x[]);
不過,我想傳遞給這個函數數組x
是堆棧內存太大的功能foo
。有沒有辦法將動態數組傳遞給foo
,或者增加堆棧內存的大小?
我想用C的一個接口,它具有以下類型將動態數組傳遞給需要類型double []的函數?
void foo(double x[]);
不過,我想傳遞給這個函數數組x
是堆棧內存太大的功能foo
。有沒有辦法將動態數組傳遞給foo
,或者增加堆棧內存的大小?
當函數期望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;
}
在函數簽名中,double x[]
相當於double *x
。你總是傳遞一個指針,一個指針並不在乎它是指向堆上的對象還是指向堆棧上的對象。只需以適當的方式分配陣列(例如,如果堆棧太大,則使用malloc
),並將結果指針傳遞給foo
。
當你傳遞一個數組到一個函數時,它退化成一個指向基類型的指針,指向第一個元素。
它從不傳遞堆棧上的所有值。
您的功能將正常工作。數組參數不會複製到堆棧,它們始終作爲指針傳遞。您寫入的函數聲明實際上等同於:
void foo(double *x);
謝謝。接口中的函數也有數組大小的參數,我只是爲了清晰起見而忽略了這一點。 –
@DavidPfau:啊,好的:)在這種情況下,只需使用'malloc'動態分配你的數組,然後將它傳遞給這個函數而不用擔心。 – LihO