如何在C中为struct分配内存

Bou*_*ist 1 c graph dynamic-memory-allocation

你好,我有以下结构:

typedef struct GRAPHE{
        int n;    /* Nombre de sommets */
        int **M;  /* Matrice d'Adjacence */
    } GRAPHE; 
Run Code Online (Sandbox Code Playgroud)

我需要分配内存,我尝试了这个功能,但似乎没有用

void reservation_en_memoire(int n, GRAPHE *g) {
    int i, j;
    g = (GRAPHE *) malloc(n * sizeof (struct GRAPHE));
    g->M = (int **) malloc(n * sizeof (int*));
    for (i = 0; i < n; i++)
        g->M[i][j] = (int) malloc(n * sizeof (int));

    g->n = n;

}
Run Code Online (Sandbox Code Playgroud)

而在主要我只是这样做:

int main(int argc, char** argv) {

    GRAPHE *g;
    reservation_en_memoire(3, g);
    printf("%d", g->n);
    //  printf("%d", g->M[0][0]);

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

请你帮我一点帮助!

Som*_*ude 5

你有一个初学者错误,因为你gmainby-value 传递指针.这意味着,在reservation_en_memoire功能,你只分配内存的副本的指针,它会消失,当函数返回一个副本(但内存的指针指向不会是未分配的,所以你有内存泄漏).然后当你gmain函数中访问时,它仍然是你在那里声明的未初始化的指针,并且你有未定义的行为.

要使其工作,您必须通过引用传递指针,即作为指针的指针.

void reservation_en_memoire(int n, GRAPHE **g) {
    *g = malloc(sizeof (GRAPHE));

    (*g)->M = malloc(n * sizeof (int*));
    for (int i = 0; i < n; i++)
        (*g)->M[i] = malloc(n * sizeof (int));

    (*g)->n = n;
}
Run Code Online (Sandbox Code Playgroud)

并使用address-of运算符调用它&:

GRAPHE *g;
reservation_en_memoire(3, &g);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我对您的reservation_en_memoire函数进行了一些实质性的更改,除了通过引用传递指针所需的更改.首先是我只分配一个 GRAPHE结构而不是n结构.第二个是在循环中我不再索引矩阵的第二维,因为它是在循环中分配的.