C:如何将双指针传递给函数
当我将双指针传递给函数以初始化内存时,我遇到了分段错误
int main() { double **A; initialize(A, 10, 10); ...... } void initialize(double **A, int r, int c) { A = (double **)malloc(sizeof(double *)*r); for(int i = 0; i< r; i++) { A[i] = (double *)malloc(sizeof(double) *c); for(int j = 0; j < c; j++) { A[i][j] = 0.0; } } }
如何将双指针传递给函数…..
如果要修改指针指针,则需要将指针传递给指针指针。
void func(double ***data) { *data = malloc(sizeof(double*)*10); for.... }; double ** data; func(&data);
像其他人所说的那样,你需要在init函数中使用一个指向指针的指针。 这是initialize
函数的变化方式:
void initialize(double ***A, int r, int c) { *A = (double **)malloc(sizeof(double *)*r); for(int i = 0; i< r; i++) { (*A)[i] = (double *)malloc(sizeof(double) *c); for(int j = 0; j < c; j++) { (*A)[i][j] = 0.0; } } }
main
是:
int main() { double **A; initialize(&A, 10, 10); }
此外,发布它时的代码在传递A
指针时不会导致分段错误。当您从函数返回并尝试访问A
,很可能发生分段错误,因为main
的A
将不会被初始化。 只有它的副本按照你的方式初始化,并且该副本是initialize
函数的本地副本,因此当你返回时它会丢失。
好吧,有一件事, A
inside initialize是A
in main
的副本 – 所以当你回到main
,它的A
仍然是未初始化的。 如果你尝试使用它 – 繁荣!
要将其传递给“按引用” initialize
,您需要将参数类型更改为double***
并在main
传入&A
。 然后,当你在initialize
时使用它时,你需要每次取消引用它,即*A
-
您没有检查内存不足错误。 失败。
-
您将未初始化的值A传递给BY VALUE以初始化()然后初始化它。 但是回到main(),那个局部变量A仍然没有初始化。 相反,你可能有initialize()返回
double**
(例如A = initialize(...)
)或修改initialize()所以它的第一个forms参数是一个double ***pA
*pA = (double**)malloc(...);
double ***pA
你初始化*pA = (double**)malloc(...);
这是你不想做的事情。 而不是为此不必要地使用out参数,在函数中分配并返回结果。 改为:
int main() { double **A; A = initialize(A10, 10); } double** initialize(int r, int c) { double **A; A = malloc(sizeof(double *)*r); for(int i = 0; i< r; i++) { A[i] = (double *)malloc(sizeof(double) *c); for(int j = 0; j < c; j++) { A[i][j] = 0.0; } } return A; }