~\++|-\+*-~
当我尝试在2D数组中分配一个值时,代码显示分段错误,即在G-> Adj [u] [v] = 0处;但我不知道这是怎么回事?因为这只是对数组的赋值。
答案 0 :(得分:0)
在二维数组分配方法中,由于错误导致分段错误,正如我们在下一行所做的那样:
G->Adj=malloc((G->V)*(G->V)*sizeof(int));
。
实际上分配了一个(G-> V)*(G-> V)整数的1D缓冲区,因此它无法像您想要的那样以2D语法启用以后的访问
简而言之:在分配2D数组时,您应该首先分配1D指针数组。 在您的代码中,应为: G->Adj = (int **)malloc(sizeof(int *)*G->V);
然后为每个指针分配G-> V个向量:
for(i=0; i < G->V; i++)
{
G->Adj[i] = (int *)malloc(sizeof(int)*G->V);
}
此外,一个好的做法是验证每个分配的分配结果都不为NULL(malloc错误)
有关向量向量分配的一般说明,您可以在Method 2: the "can still use [r][c] syntax to access" way上阅读更多内容
除此之外,程序的末尾缺少内存释放,因此您应该以相反的顺序(向量和指针)添加对free()的调用
答案 1 :(得分:0)
#include<stdio.h>
#include<stdlib.h>
struct Graph{
int V;
int E;
int **Adj;
};
struct Graph* adjMatrix(){
int u,v,i;
struct Graph *G;
G=malloc(sizeof(struct Graph));
if(!G){
printf("Memory Error!\n");
return 0;
}
printf("Enter number of nodes and number of edges:\n");
scanf("%d %d",&G->V,&G->E);
//First problem was here this is how you allocate a 2D array dynamically
G->Adj=malloc((G->V)*sizeof(int*));
for(u=0;u<G->V;u++)
G->Adj[u]=malloc((G->V)*sizeof(int));
for(u=0;u<(G->V);u++)
for(v=0;v<(G->V);v++)
G->Adj[u][v]=0; //This gives a segmentation fault.
// i added some adjustment here to help you
printf("Enter node numbers in pair that connect an edge:\n");
for(i=0;i<(G->E);i++){
scanf("%d %d",&u,&v);
if(u>=G->V || v>=G->V){
printf("Error give the right input\n");
i--;}
else{
G->Adj[u][v]=1;
G->Adj[v][u]=1;}
}
return(G);
}
int main(){
struct Graph *G;
int i,j,count=0;
G=adjMatrix();
for(i=0;i<G->V;i++){
for(j=0;j<G->V;j++){
printf("%d ",G->Adj[i][j]);
count++;
}
if(count==G->V)
printf("\n");
}
return 0;
}