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

ved*_*eda 14 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;
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

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

Let*_*_Be 18

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

void func(double ***data) { *data = malloc(sizeof(double*)*10); for.... };
double ** data; func(&data);
Run Code Online (Sandbox Code Playgroud)

  • 只需重新访问我的C:如果要修改C中的指针,则需要将指针传递给指针.如果需要修改指针指针,则需要将指针传递给指向指针的指针.为什么?那么我们可以说,如果我们想要修改一个值,我们还需要传递一个指向该值的指针吗?请解释一下.提前致谢. (2认同)

IVl*_*lad 18

像其他人所说的那样,你需要在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;
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

而且main将是:

int main()
{
    double **A;
    initialize(&A, 10, 10);
}
Run Code Online (Sandbox Code Playgroud)

此外,发布它时的代码在传入A指针时不会导致分段错误.当您从函数返回并尝试访问时A,很可能发生分段错误,因为Ain main不会被初始化.只有它的副本按照你的方式初始化,并且该副本是initialize函数的本地副本,因此当你返回时它会丢失.