动态内存分配问题(以C为单位)

raf*_*ame 3 c malloc memory-management dynamic-memory-allocation

请考虑以下代码:

#include <stdio.h>
#include <malloc.h>

void allocateMatrix(int **m, int l, int c)
{
    int i;

    m = (int**) malloc( sizeof(int*) * l );
    for(i = 0; i < l; i++)
        m[i] = (int*) malloc( sizeof(int) * c );
}

int main()
{
    int **m;
    int l = 10, c = 10;
    allocateMatrix(m, l, c);
    m[0][0] = 9;
    printf("%d", m[0][0]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码将生成内存分配错误并将崩溃.

但下面的代码将正常工作,问题是:为什么?

#include <stdio.h>
#include <malloc.h>

int** allocateMatrix(int l, int c)
{
    int i;

    int **m = (int**) malloc( sizeof(int*) * l );
    for(i = 0; i < l; i++)
        m[i] = (int*) malloc( sizeof(int) * c );
    return m;
}

int main()
{
    int **m;
    int l = 10, c = 10;
    m = allocateMatrix(l, c);
    m[0][0] = 9;
    printf("%d", m[0][0]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么第一个代码崩溃,因为我只是将指针指向m(保存矩阵的内存第一个内存地址的变量)作为参数传递.我发现代码之间没有区别(实际上).我将不胜感激任何明确的解释.

谢谢Rafael Andreatta

cni*_*tar 7

在第一个示例中,您不初始化m.你只需要更改它的副本.所以,换句话说,来电者永远不会看到你做了什么m.

在第二个示例中,您分配内存,然后返回指向它的指针.这是有效的.

您可能能够像这样修复您的第一个示例(未经测试但应该工作):

void allocateMatrix(int ***m, int l, int c)
{
    int i;

    *m = malloc( sizeof(int*) * l );
    for(i = 0; i < l; i++)
        (*m)[i] = malloc( sizeof(int) * c );
}


/* ... */

allocateMatrix(&m, l, c);
Run Code Online (Sandbox Code Playgroud)

编辑

我花了一段时间,但我找到了它.像往常一样,C FAQ对此有所说明.