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 ,很可能发生分段错误,因为mainA将不会被初始化。 只有它的副本按照你的方式初始化,并且该副本是initialize函数的本地副本,因此当你返回时它会丢失。

好吧,有一件事, A inside initialize是A in main的副本 – 所以当你回到main ,它的A仍然是未初始化的。 如果你尝试使用它 – 繁荣!

要将其传递给“按引用” initialize ,您需要将参数类型更改为double***并在main传入&A 。 然后,当你在initialize时使用它时,你需要每次取消引用它,即*A

  1. 您没有检查内存不足错误。 失败。

  2. 您将未初始化的值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; }