如何使用通过引用C中的函数传递的指针来malloc 2d锯齿状数组

Bre*_*dan 3 c malloc function multidimensional-array

我的main()块中声明了一个2D锯齿状数组.这将被传递给一个函数,以便为其分配内存.以下是最简化的情况,它会在运行时编译但崩溃.我哪里错了?

#include <stdio.h>
#include <stdlib.h>

void alloc2d(double ***p);


int main () {

    double **data;

    alloc2d(&data);
    printf("Before assign to data\n");
    data[0][0] = 0.1;
    printf("After assign to data\n");
    free(data);
}


void alloc2d(double ***p) {

    int i, n, m;

    // Get some dynamically assigned sizes
    printf("Enter size: ");
    scanf("%d %d", &n, &m);    
    // Now allocate
    *p = malloc(n * sizeof(double*));
    for (i = 0; i < n; i++) {
        *p[i] = malloc(m * sizeof(double));
    }
    printf("End of alloc2d\n");
}
Run Code Online (Sandbox Code Playgroud)

这会读取值,但是当我输入低数字(即'1 1')时会崩溃,但是当我输入高数字(即'10 10')时会崩溃.

Jim*_* Lu 6

你做了一个非常简单的语法错误

*p[i] = (double*)malloc(m * sizeof(double));
Run Code Online (Sandbox Code Playgroud)

应该真的

(*p)[i] = (double*)malloc(m * sizeof(double));
Run Code Online (Sandbox Code Playgroud)

这是因为在C中,[]运算符的优先级高于*.因此,当您键入时*p[i],它会被翻译成**(p + i).

这意味着:您要求编译器通过偏移p by的地址来计算地址i * sizeof(double**),这显然不是您真正想要的.

因此,为了强制编译器首先取消引用p,只需*p用括号括起来.