开发者

C: How to pass a double pointer to a function

开发者 https://www.devze.com 2023-01-29 02:12 出处:网络
I am getting an segmentation fault when I pass the double pointers to the function to initialize the memo开发者_运维百科ry

I am getting an segmentation fault when I pass the double pointers to the function to initialize the memo开发者_运维百科ry

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;
        }
   }
}

How can I pass the double pointers to the functions.....


Like others have said, you need to take a pointer to pointer to pointer in your init function. This is how the initialize function changes:

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;
        }
   }
}

And main will be:

int main()
{
    double **A;
    initialize(&A, 10, 10);
}

Also, the code as you posted it should cause no segmentation fault when passing the A pointer in. The segmentation fault most likely occurs when you return from the function and try to access A, because the A in main will not have been initialized. Only a copy of it is initialized the way you do it, and that copy is local to the initialize function, so it's lost when you return.


If you want to modify a pointer to pointer you need to pass a pointer to pointer to pointer.

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


Well for one thing, the A inside initialize is a copy of the A in main -- so when you get back to main, its A is still uninitialized. If you try and use it -- boom!

To pass it to initialize 'by reference', you need to change the parameter type to double*** and pass in &A in main. Then, when you use it in initialize, you need to dereference it each time, i.e. *A.


  1. You are not checking for out of memory errors. Fail.

  2. You pass BY VALUE an uninitialized value A to initialize() and then initialize that. But back in main(), that local variable A is still uninitialized. Instead you might have initialize() return the double** (e.g. A = initialize(...)) or modify initialize() so its first formal parameter is a double ***pA that you initialize with *pA = (double**)malloc(...);


This is the kind of thing you do not want to do. Instead of unnecessarily using an out argument for this, allocate in the function and return the result. Do this instead:

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;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号