Как выделить память двойного указателя в функции?

Я пытаюсь выделить память двойного указателя, объявленного в функции main:

int main () {

    float **a, **b, **c;

    inicializarMatriz (&a, &b, &c);
}

Внутри функции inicializarMatriz следует выделить матрицу (двойной указатель).

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 и программа вылетает. Любая идея о том, что не так?


person JuMoGar    schedule 04.10.2018    source источник
comment
**a = (float **) malloc ( N * sizeof(float *) ); должно быть *a = (float **) malloc ( N * sizeof(float *) ); (то же самое для b и c), и не использовать malloc   -  person David Ranieri    schedule 04.10.2018
comment
a относится к типу float ***. *a относится к типу float **. **a относится к типу float *. ***a относится к типу float. Я надеюсь, вы видите образец.   -  person Some programmer dude    schedule 04.10.2018
comment
тогда это задание тоже неверно, верно? a[i] = (float *) malloc ( N * sizeof(float) ); . Это должно быть: *a[i] = (float *) malloc ( N * sizeof(float) ); ?   -  person JuMoGar    schedule 04.10.2018
comment
Не забывайте об приоритете оператора. *a[i] равно *(a[i]), а не (*a)[i], что вам нужно.   -  person Some programmer dude    schedule 04.10.2018
comment
Спасибо. Это решает мою проблему. Пожалуйста, ответь на мой вопрос, и я выберу тебя.   -  person JuMoGar    schedule 04.10.2018
comment
Слишком много звезд. Я бы настоятельно рекомендовал вам вместо этого использовать 2D-массивы. См. Правильное выделение многомерных массивов.   -  person Lundin    schedule 04.10.2018
comment
Это еще один хороший пример того, как приведение результата malloc выявило серьезную ошибку кода.   -  person Ctx    schedule 04.10.2018
comment
Обзор Приведение результата malloc? также может быть уместным.   -  person David C. Rankin    schedule 04.10.2018


Ответы (1)


Как предполагает @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");
    }
}

Решение задачи закомментировано внутри той же строки в конце.

person JuMoGar    schedule 09.10.2018