【发布时间】:2015-12-04 22:58:39
【问题描述】:
我正在尝试读取一个文件并从该文件创建一个邻接列表,但是当我从命令行读取该文件时,我得到一个分段错误 gcc n00889642.c ./a.out test.txt 分段错误
为什么会这样?
main(int argc, char *argv[]){
int index;
int i;
char vertex1;
char vertex2;
FILE *f = fopen(argv[1], "r");
while (fscanf(f, " %c %c", vertex1, vertex2) != EOF)
{
for(i = 0; i<26; i = i + 1)
{
if(i == vertexCount)
{
InsertVertex(vertex1);
break;
}
if(strcmp(graph[i], vertex1) == 0)
{
break;
}
}
for(i=0; i<26; i = i + 1)
{
if(i == vertexCount)
InsertVertex(vertex2);
if(strcmp(graph[i], vertex2)== 0)
break;
}
}
fclose(f);
i = 1;
while(i < vertexCount)
{
insertEdge(graph[0].vertexKey, graph[i].vertexKey);
i= i + 1;
}
f = fopen(argv[1], "r");
while(fscanf(f, " %c %c", vertex1, vertex2) != EOF)
{
if(strcmp(graph[0], vertex1) != 0)
insertEdge(vertex1, vertex2);
}
fclose(f);
printGraph();
return 0;
}
这是我的代码的主要部分
【问题讨论】:
-
调试一下就知道了。显然你没有尝试过 - 你甚至没有检查
fopen的结果@ -
遇到段错误时,通常应该尝试的第一件事是启用调试符号并在调试器中运行。这会告诉你程序的哪一行崩溃了。但是,在该行之前通常会出现逻辑错误,导致指针包含垃圾。你想预防这些,而不是治愈它们。养成的好习惯:在写入数组之前检查数组的边界。检查库调用中的错误。使用
assert()和static_assert()确保您对程序状态的假设是正确的。每当你使用指针时,你应该知道为什么它是正确的。 -
您还应该打开编译器警告并注意它们。在 GCC/Clang 上,这是
-g -Wall -Wextra -pedantic。 Clang 还允许-Weverything。
标签: c segmentation-fault