【发布时间】:2014-02-18 05:18:43
【问题描述】:
程序应该生成一个图并将其邻居存储在邻接列表中。我在解析列表时得到SEGFAULT。这很奇怪,因为当我尝试一个一个访问列表时,它工作正常。
我的代码:
int main(void)
{
typedef struct linkedList{
int vertice;
struct linkedList *next;
}LL;
typedef struct vertex{
int color;
int noOfNeighbours;
LL *adj;
}vertex;
int E, V;
scanf ("%d %d", &V, &E);
//printf ("%d %d", E, V);
int i, j; //loop variables
vertex arrOfVertices [V];
for (i=0; i<V; i++)
{
arrOfVertices[i].color=-1;
arrOfVertices[i].noOfNeighbours=-1;
arrOfVertices[V].adj = NULL;
}
printf ("Output is : \n");
int firstV, secondV;
for (i=0; i<E;i++)
{
scanf ("%d %d", &firstV, &secondV);
LL* temp = malloc (sizeof(LL));
temp -> vertice = secondV-1;
if (arrOfVertices[firstV-1].adj == NULL)
{
arrOfVertices[firstV-1].adj=temp;
arrOfVertices[firstV-1].adj->next=NULL;
}
else
{
temp->next=arrOfVertices[firstV-1].adj;
arrOfVertices[firstV-1].adj=temp;
}
}
//Printing the list function. This part strangely segfaults and I don't know why
for (j=0; j<V;j++)
{
LL* parser = arrOfVertices[j].adj;
// printf ("%d : Color: %d\n", i+1, arrOfVertices[i].color);
while (parser!=NULL)
{
printf ("%d\n", parser->vertice);
parser = parser->next;
}
}
return 0;
}
【问题讨论】:
-
int firstV, secondV;使用时似乎没有初始化并且没有赋值?
-
@Jerry_Y
scanf(),假设它有效,应该算作something。 -
其实没关系,因为测试用例提供了 E 的值,然后它正好有 E 行。
-
顶点 arrOfVertices [V]; arrOfVertices[V].adj = NULL;似乎您也访问了索引之外。
-
它直接超出了数组索引的声明边界(对于大小为 V 的数组,为 0..V-1),因此会调用未定义的行为。恕我直言,这是一个错字。应该是
arrOfVertices[i].adj = NULL;
标签: c list linked-list segmentation-fault singly-linked-list