C:如何将双指针传递给函数

时间:2010-12-02 19:52:10

标签: c function segmentation-fault

当我将双指针传递给函数以初始化内存

时,我遇到了分段错误
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;
        }
   }
}

如何将双指针传递给函数.....

5 个答案:

答案 0 :(得分:17)

如果要修改指针指针,则需要将指针传递给指向指针。

void func(double ***data) { *data = malloc(sizeof(double*)*10); for.... };
double ** data; func(&data);

答案 1 :(得分:17)

就像其他人所说的那样,你需要在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时,很可能会发生分段错误,因为A中的main将不会被初始化。只有它的副本按照你的方式初始化,并且该副本是initialize函数的本地副本,因此当你返回时它会丢失。

答案 2 :(得分:1)

一方面,A内部初始化是Amain的副本 - 所以当你回到main时,它的{{1}仍未初始化。如果你尝试使用它 - 繁荣!

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

答案 3 :(得分:1)

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

  2. 您将未初始化的值A传递给BY VALUE以初始化(),然后将其初始化。但是回到main(),那个局部变量A仍然没有初始化。相反,您可能有initialize()返回double**(例如A = initialize(...))或修改initialize(),因此其第一个形式参数是double ***pA,您使用*pA = (double**)malloc(...);初始化

答案 4 :(得分:1)

这是你不想做的事情。而不是为此不必要地使用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;
}