双指针在函数中没有得到malloc’d

所以我在C中工作,我在一个函数内部有一个int ** ,它在另一个函数中被修改。 当我运行这个问题时,我得到了一个SegFault,所以我决定用gdb调试它。 我发现内存从未分配给这个数组。 我的function是这样的

 void declarer() { int ** a; alocator(a, 4, 5); for (int i = 0; i < 4; i++) for (int j = 0; j < 5; j++) printf("%d\n", a[i][j]); } void alocator(int ** a, int b, int c) { a = (int **)malloc(sizeof(int *) * b); for (int i = 0; i < b; i++) { a[i] = (int *)malloc(sizeof(int) * c); for (int j = 0; j < c; j++) a[i][j] = j; } } 

当我在行alocator(a, 4, 5)之后运行带有断点的gdb (在程序段错误之前),并且我写了pa ,我得到$1 = (int **) 0x0 ,这表明a是在地址0x0并且有没有为它分配内存。 为什么alocator没有为它分配内存,我怎样才能让alocator为内存分配内存?

因为你传递**a值,你必须将它作为指针传递。 所以使用三指针:

 void declarer() { int **a; alocator(&a, 4, 5); ... } void alocator(int ***a, int b, int c) { *a = (int **)malloc(sizeof(int *) * b); ... 

您将变量a按值传递给函数,因此不会更改其值。 你有两个解决方案:

更改函数以接受int ***类型的值并传递by地址,或将函数的返回值更改为int **并在调用时使用该值。

例:

 void declarer() { int ** a = alocator(4, 5); for (int i = 0; i < 4; i++) for (int j = 0; j < 5; j++) printf("%d\n", a[i][j]); } int **alocator(int b, int c) { int **a = (int **)malloc(sizeof(int *) * b); for (int i = 0; i < b; i++) { a[i] = (int *)malloc(sizeof(int) * c); for (int j = 0; j < c; j++) a[i][j] = j; } return a; }