这个初始化有什么问题?为什么我尝试使用初始化函数初始化图形时无法成功

What's wrong with this initialization? Why can't I succeed when I try to initialize a graph using the initialization function

使用VS,C语言。 我尝试通过初始化函数

来初始化图形结构
#include<stdio.h>
#define maxint 1000
#define mvnum 100
typedef struct
{
  int vexs[mvnum];
  int edges[mvnum][mvnum];
  int n, e;
}MGraph;
void creatUDN(MGraph *G) {
  G = (MGraph*)malloc(sizeof(MGraph));
  int i, j, k, w;
  scanf_s("%d", &(G->n));
  scanf_s("%d", &(G->e));
  for (i = 0; i < G->n; i++)
      scanf_s("%d", &(G->vexs[i]));
  for (i = 0; i < G->n; ++i)
      for (j = 0; j < G->n; ++j)
          G->edges[i][j] = maxint;
  for (k = 0; k < G->e; k++)
  {
      scanf_s("%d %d %d", &i, &j, &w);
      G->edges[i-1][j-1] = w;
  }
  for (i = 0; i < G->n; ++i)
  {
      for (j = 0; j <G->n; ++j)
          printf("%d\t", G->edges[i][j]);
      printf("\n");
  }
}

这是主要功能

    int main()
{
  MGraph *g;
  g=(MGraph*)malloc(sizeof(MGraph));
  creatUDN(g);
  **printf("%d", g->e);**
}

说明g在初始化之后还是一个Nullpointer。 为什么?

creatUDN 中删除对 G 的分配。

G = (MGraph*)malloc(sizeof(MGraph));

现在您的代码可以运行了。

您在 main 中正确分配了此数据结构并将指针传递给 creatUDN,但出于某种原因您在 creatUDN 中再次分配了它,因此您分配的数据结构在main保持不变。

另一种方法是 returncreatUDN 分配的数据结构。看起来像这样

MGraph *creatUDN() {
  G = (MGraph*)malloc(sizeof(MGraph));
  ...
  return G;
}

int main()
{
  MGraph *g = creatUDN();
  printf("%d", g->e);
}

您似乎写了介于这两种方法之间的东西。