我正在实现一个基于C语言邻接矩阵的图程序。 但是我在初始化矩阵(分配零值(时遇到了分割错误。 我不确定我在访问双指针时是否犯了任何错误。
任何人都可以帮助我解决问题吗?
这是代码:
struct Graph {
int V;
int E;
int **adj;
};
struct Graph *addelements() {
int i,j,a,u,v;
struct Graph *G= (struct Graph*)malloc(sizeof(struct Graph*));
printf("Enter the number of vertices and edges : ");
scanf("%d %d", &G->V,&G->E);;
printf("%d, %dn",G->V ,G->E);
//G->adj = (int **)malloc(sizeof(int **)*(G->V * G->E));
G->adj = malloc(sizeof(G->V * G->E));
//Initialization of vertices
for(i=0;i<=G->V;i++) {
for(j=0;i<=G->V;j++) {
G->adj[i][j]=0;
}
}
//Reading the edges;
for(i=0;i<G->E;i++) {
printf("Enter the source and destination : ");
scanf("%d %dn", &u,&v);
G->adj[u][v]=1;
G->adj[v][u]=1;
}
//printing the matrix
for(i=0;i< G->V;i++) {
for(j=0;i< G->V;j++) {
printf("%d", G->adj[i][j]);4
}
}
return G;
}
int main() {
struct Graph *a= (struct Graph*)malloc(sizeof(struct Graph*));
a = addelements();
}
输出:
输入顶点和边的数量:4 5
分段故障(核心转储(
正如你提到的,你的错误就在那里
G->adj = malloc(sizeof(G->V * G->E));
//Initialization of vertices
for(i=0;i<=G->V;i++)
{
for(j=0;j<=G->V;j++)
{
G->adj[i][j]=0;
}
}
您正在
adj[V][V]
处写入,您分配了sizeof(G->V * G->E)
的大小,这将是sizeof(int)
(一个整数(,即使您想要最多adj[V][E]
此外,您正在分配一维数组并访问一维数组,访问
adj[0][0]
将首先尝试读取adj[0]
作为指向数组的指针(未定义的值(,并尝试写入undefined[0]
使用malloc( G->V * G->V * sizeof(int) )
进行分配,使用adj[i*V+j]
进行访问/写入
由于您期望代码的行为与它真正理解您的方式,您的逻辑中存在很多错误。使用调试器了解错误发生的位置并检查所涉及的变量可能很有用。
编辑:
正如其他答案提到的:
您正在为G
分配一个 small 的大小,因为malloc(sizeof(struct Graph*))
等同于malloc(sizeof(void*))
(分配一个指针的大小(,您在其中malloc(sizeof(struct Graph))
第二次编辑:
注意到j
循环中的拼写错误for(j=0;i<=G->V;j++)
应该for(j=0;j<=G->V;j++)
我认为您需要修改
struct Graph *G= (struct Graph*)malloc(sizeof(struct Graph*));
自
struct Graph *G= malloc(sizeof(struct Graph));
因为您需要分配空间来存储结构变量而不是指针。
而且您没有为G->adj
正确分配空间。
尝试
G->adj = malloc(sizeof(int **));
for(int i=0; i<G->V; ++i)
{
G->adj[i]=malloc(sizeof(int)*G->V);
}
并将您的循环修改为
for(i=0;i<G->V;i++)
{
for(j=0;j<G->V;j++)
{
G->adj[i][j]=0;
}
}
即,将<=
更改为<
以防止超出数组范围访问。
在阅读边缘时,不要这样做
scanf("%d %dn", &u,&v);
最后是换行符。看到这里。
此外,您需要检查输入的u
和v
值是否在限制范围内,如
for(i=0;i<G->E;i++)
{
printf("Enter the source and destination : ");
scanf("%d %d", &u,&v);
if(u<G->V && v<G->V)
{
G->adj[u][v]=1;
G->adj[v][u]=1;
}
else
{
printf("ninvalid value. Try again.");
i--;
}
}
而且,您无需在main()
中为该struct
指针分配空间,因为您已经为将在addelements()
函数中存储在该指针中的值分配了内存。否则会导致内存泄漏。
所以,在main()
中,做
struct Graph *a= addelements();
请注意,如果malloc()
分配内存失败,则返回NULL
。您还需要检查malloc()
调用是否失败。
而且你不需要在 C 中强制转换malloc()
的返回值。
您正在为指针malloc
空间。请改用:
malloc(sizeof(struct Graph));