如何在C中为struct分配内存

时间:2013-11-18 12:26:51

标签: c graph dynamic-memory-allocation

您好我在下面有这个结构:

typedef struct GRAPHE{
        int n;    /* Nombre de sommets */
        int **M;  /* Matrice d'Adjacence */
    } GRAPHE; 

我需要分配内存,我尝试了这个功能,但它似乎无法正常工作

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;

}

总的来说,我只是这样做:

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);
}

请你在这里给我一点帮助!!

2 个答案:

答案 0 :(得分:5)

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

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

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;
}

使用地址操作符&调用它:

GRAPHE *g;
reservation_en_memoire(3, &g);

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

答案 1 :(得分:0)

我看到了几个问题:

  • j未初始化
  • 如果M应该是GRAPHE的每个实例,那么您的代码将无效
  • g = ... malloc( n * ... )正在分配nGRAPHE个副本,然后您可以将其作为g->(struct_member)进行访问。成功调用g后,malloc指向数组。如果阵列确实是你的意图,你应该以{{1​​}}的身份访问它。
  • g[index]中的代码完成后,
  • q未保存,因此您永远不会在[{1}}
  • 中看到reservation_en_memoire的结果
  • 如果你真的打算分配一个GRAPHE数组,你需要循环并初始化数组的每个成员。

这应该足以让你走上正确的轨道......