C中的二维动态数组分配和参考传递

hol*_*ron 5 c pass-by-reference segmentation-fault multidimensional-array dynamic-memory-allocation

有人比我更聪明,请向我解释为什么以下代码段出错?通过引用分配内存没有问题,但是一旦我尝试分配任何内容或通过引用释放,就会发生段错误.

我确定我错过了一些关于指针和通过引用传递的基本概念,希望可以解决一些问题.

#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;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 8

一组问题在这里:

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

您需要分配以*m将信息返回到调用代码,并且还需要(*m)[i]在循环中分配.

void allocateMatrix(float ***m)
{
    *m = malloc(2*sizeof(float*));
    for (int i = 0; i < 2; i++)
        (*m)[i] = malloc(2*sizeof(float));
}
Run Code Online (Sandbox Code Playgroud)

其他功能至少有可能是正常的.该fillMatrix()写入和正确调用,但它可以通过失去第三简化*从指针:

void fillMatrix(float **m)
{
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
            m[i][j] = 1.0;        
    }
}
Run Code Online (Sandbox Code Playgroud)

可能建议将三指针传递给freeMatrix()调用函数中的指针归零:

void freeMatrix(float ***m)
{
    for (int i = 0; i < 2; i++)
        free((*m)[i]);
    free(*m);
    *m = 0;
}
Run Code Online (Sandbox Code Playgroud)

然后呼叫成为:

allocateMatrix(&matrix);
fillMatrix(matrix);
freeMatrix(&matrix);   
Run Code Online (Sandbox Code Playgroud)