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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在函数中分配双指针的内存?相关的知识,希望对你有一定的参考价值。

我试图分配在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和程序崩溃了。什么是错的?

答案

正如@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");
    }
}

该问题的解决方案最终在同一条线内得到了解决。

以上是关于如何在函数中分配双指针的内存?的主要内容,如果未能解决你的问题,请参考以下文章

通过指针子函数中分配内存,在主函数中实现赋值

如何使用指针在另一个函数中分配数组

在结构中分配内存时出现不可预测的行为

如何在单独的 CUDA 函数中分配 GPU 内存?

Java中的引用和指针

检查指针是不是已分配内存