代码之家  ›  专栏  ›  技术社区  ›  JuMoGar

如何在函数中分配双指针的内存?

  •  1
  • JuMoGar  · 技术社区  · 7 年前

    我正在尝试分配中声明的双指针的内存 main

    int main () {
    
        float **a, **b, **c;
    
        inicializarMatriz (&a, &b, &c);
    }
    

    内部 inicializarMatriz 函数应该malloc矩阵(双指针)。

    void inicializarMatriz(float ***a, float ***b, float ***c) {
        // Reservar espacio de memoria para la matriz a
        **a = (float **) malloc ( N * sizeof(float *) );
        for (int i = 0; i < N; ++i) {
            a[i] = (float *) malloc ( N * sizeof(float) );
        }
        if ( a == NULL ) {
            fprintf(stderr, "No se ha podido asignar memoria a la matriz a");
        }
    
        // Reservar espacio de memoria para la matriz b
        **b = (float **) malloc ( N * sizeof(float *) );
        for (int i = 0; i < N; ++i) {
            b[i] = (float *) malloc ( N * sizeof(float) );
        }
        if ( b == NULL ) {
            fprintf(stderr, "No se ha podido asignar memoria a la matriz b");
        }
    
        // Reservar espacio de memoria para la matriz c
        **c = (float **) malloc ( N * sizeof(float *) );
        for (int i = 0; i < N; ++i) {
            c[i] = (float *) malloc ( N * sizeof(float) );
        }
        if ( c == NULL ) {
            fprintf(stderr, "No se ha podido asignar memoria a la matriz c");
        }
    }
    

    [Warning] assignment from incompatible pointer type 程序崩溃了。你知道怎么了吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   JuMoGar    7 年前

    正如@SomeProgrammerDude所建议的,下一个工作代码是:

    int main () {
    
        float **a, **b, **c;
    
        inicializarMatriz (&a, &b, &c);
    }
    
    void inicializarMatriz(float ***a1, float ***b1, float ***c1) {
        // Reservar espacio de memoria para la matriz a
        *a1 = (float **) malloc ( N * sizeof(float *) ); // *a1 = **a
        for (int i = 0; i < N; ++i) {
            (*a1)[i] = (float *) malloc ( N * sizeof(float) ); // (*a1)[i] = a[i]
        }
        if ( a == NULL ) {
            fprintf(stderr, "No se ha podido asignar memoria a la matriz a");
        }
    
        // Reservar espacio de memoria para la matriz b
        *b1 = (float **) malloc ( N * sizeof(float *) ); // *b1 = **b
        for (int i = 0; i < N; ++i) {
            (*b1)[i] = (float *) malloc ( N * sizeof(float) ); // (*b1)[i] = b[i]
        }
        if ( b == NULL ) {
            fprintf(stderr, "No se ha podido asignar memoria a la matriz b");
        }
    
        // Reservar espacio de memoria para la matriz c
        *c1 = (float **) malloc ( N * sizeof(float *) ); // *c1 = **c
        for (int i = 0; i < N; ++i) {
            (*c1)[i] = (float *) malloc ( N * sizeof(float) ); // (*c1)[i] = c[i]
        }
        if ( c == NULL ) {
            fprintf(stderr, "No se ha podido asignar memoria a la matriz c");
        }
    }