繁体   English   中英

如何在C中分配内存以构造

[英]How to allocate memory to struct in C

您好,我的结构如下:

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

你能在这里给我一点帮助吗!

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

为了使其工作,您必须按引用传递指针,即作为指向指针的指针。

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结构。 第二个是在循环中,我不再索引矩阵的第二维,因为它是循环中分配的内容。

我看到几个问题:

  • j未初始化
  • 如果应该将M作为GRAPHE每个实例,则您的代码将无法工作
  • g = ... malloc( n * ... )正在分配nGRAPHE副本,然后以g->(struct_member) g成功调用malloc后指向一个数组。 如果数组确实是您的意图,则应以g[index]形式访问它。
  • reservation_en_memoire的代码完成后,不会保存q,因此您将永远不会看到在main反映reservation_en_memoire的结果
  • 如果您确实打算分配一个GRAPHE数组,则需要遍历并初始化该数组的每个成员。

那应该足以使您走上正确的道路...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM