Динамическое размещение двухмерного массива и передача по ссылке в C

Может ли кто-нибудь умнее меня объяснить мне, почему следующий сегмент кода дает сбой? Нет проблем с выделением памяти по ссылке, но как только я пытаюсь что-то назначить или освободить по ссылке, происходит segfault.

Я уверен, что упускаю какую-то фундаментальную концепцию указателей и передачи по ссылке, надеюсь, можно пролить свет.

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

void allocateMatrix(float ***);
void fillMatrix(float ***);
void freeMatrix(float **);

int main() {
    float **matrix;

    allocateMatrix(&matrix);        // this function calls and returns OK
    fillMatrix(&matrix);            // this function will segfault
    freeMatrix(matrix);             // this function will segfault

    exit(0);
}

void allocateMatrix(float ***m) {
    int i;
    m = malloc(2*sizeof(float*));
    for (i = 0; i < 2; i++) {
        m[i] = malloc(2*sizeof(float));
    }
    return;
}

void fillMatrix(float ***m) {
    int i,j;
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) {
            (*m)[i][j] = 1.0;        // SEGFAULT
        }
    }
    return;
}

void freeMatrix(float **m) {
    int i; 
    for (i = 0; i < 2; i++) {
        free(m[i]);                  // SEGFAULT
    }
    free(m);
    return;
}
5
задан holocron 7 April 2012 в 04:36
поделиться