这是我的书房
struct node{
int V,E;
int **adj;
};
这是我创建图形的代码:
struct node* create()
{
int i,j,x,y;
struct node *G=malloc(sizeof(struct node));
printf("Write the number of vertex and edges\n");
scanf("%d%d",&G->V,&G->E);
G->adj=malloc(sizeof(int)*(G->V * G->V));
if(!G->adj){
printf("Out of memory\n");
return;
}
for(i=0;i<G->V;i++)
for(j=0;j<G->V;j++)
G->adj[i][j]=0;
printf("\nWrite the source node and destination: ");
for(i=0;i<G->E;i++){
scanf("%d%d",&x,&y);
G->adj[x][y]=1;
G->adj[y][x]=1;
}
return(G);
}
并且我将此函数返回的指针存储在另一个这样的指针中:
int main()
{
struct node *G=create();
}
编译程序时,系统会询问我顶点和边的数量,但是一旦输入值,程序就会崩溃。我想知道原因。这是因为内存分配失败吗?
答案 0 :(得分:0)
C99样式的可变长度数组仅对局部变量或参数有用。因此,您可以使用两种经典的C方法来实现2D数组。
这就是您的结构的样子。这样,您就需要为指针数组和数据分配单独的空间:
G->adj = calloc(G->V, sizeof (int*));
assert(G->adj != NULL); /* need assert.h for this */
for (i=0; i<G-V; ++i)
{
G->adj[i] = calloc(G->V, sizeof (int));
assert(G->adj[i] != NULL);
}
先对数组数据进行一次大容量分配,然后使用指针算法设置G->adj[]
指针,这在内存上要容易一些,但是上面的想法是,就C而言,每一行是一个单独的数组。
将adj
的类型更改为仅int*
,然后:
G->adj = calloc(G->V * G->V, sizeof (int));
assert(G->adj != NULL);
就是这样。现在,当您访问元素时,请使用G->adj[i*G->V + j]
而不是G->adj[i][j]
。宏可能有助于提高可读性。