在C语言中通过遍历链表来分割错误?

在C语言中通过遍历链表来分割错误?,c,segmentation-fault,C,Segmentation Fault,我对C语言还比较陌生,正在开发一个程序,可以创建地址信息的链接列表,按城市字母顺序排序。当我试图打印列表时(只打印姓名和城市),每次都会有一个特定条目出现分段错误,大约是列表的三分之四。我使用fgets从一个文件中逐行读取数据,但我遇到的一个问题是“城邦Zip”都以该格式在一行上,但我只想打印城市。这段代码遍历已建立的条目链接列表,并尝试按顺序打印出每个条目的名称和城市。我可以移动并打印姓名,但其中一个条目在我尝试制作城市时给出了segfault。因为有些城市是两个词,所以我必须在其中输入代码来

我对C语言还比较陌生,正在开发一个程序,可以创建地址信息的链接列表,按城市字母顺序排序。当我试图打印列表时(只打印姓名和城市),每次都会有一个特定条目出现分段错误,大约是列表的三分之四。我使用fgets从一个文件中逐行读取数据,但我遇到的一个问题是“城邦Zip”都以该格式在一行上,但我只想打印城市。这段代码遍历已建立的条目链接列表,并尝试按顺序打印出每个条目的名称和城市。我可以移动并打印姓名,但其中一个条目在我尝试制作城市时给出了segfault。因为有些城市是两个词,所以我必须在其中输入代码来解释这一点(这就是为什么我有这四个词——可能有更好的方法,但这正是我想做的)

调用
realloc()
函数后会出现分段错误。当为导致segfault的特定条目执行打印四个字的调用时,如下所示:

Tampa_NC_28211
_(null)_
我不太理解指针的疯狂,所以我一直很困惑为什么这个条目不起作用,以及我能做些什么来绕过它。我尝试在
realloc()
之后添加一个if语句,检查
fourthWord
是否为
NULL
,但它从未输入它。关于如何避免segfault的任何帮助?

strtok()
函数的第一个参数为
NULL
且输入字符串中没有更多标记时,该函数返回
NULL
。你不需要为此进行测试;如果发生这种情况,只需将
NULL
记录在一个变量中即可。因此,如果您遇到一条包含少于四个令牌的城市线,您将在
printf()
参数中传递至少一个
NULL
。这将产生未定义的行为,而您观察到的失败很可能是实际结果

更一般地说,如果您实际上关心是否发生了错误,并且通常应该关心是否发生了错误,那么您应该始终检查函数返回值的错误条件。例如,在显示的代码中,除了检查
strtok()
的返回值外,还应检查
malloc()
realloc()
的返回值。您还可以检查
printf()
s的返回值,但在这种情况下,您可能不太关心这些返回值


此外,正如@melpomene最初观察到的,您分配(然后重新分配)内存,但从未释放它。当变量
myCity
在循环的每次迭代结束时超出范围时,或者在为其分配新值之前超出范围时,将丢失指向该分配内存的唯一指针。这构成了内存泄漏。但是,内存泄漏通常不会导致分段错误。

您是否在调试器中单步执行了代码?这就是第1步。
myCity=realloc(…)。。。myCity=…
是一个bug。你在泄漏内存。我正在mac上使用终端,它无法识别gdb命令。我不知道还有其他调试器,但我能够通过一堆printf语句缩小错误的范围。有没有关于内存问题的快速解决方案?对不起,我已经习惯java了,所以我对控制内存分配不是很有经验,为什么不向前解析呢?提取zip和state。剩下的就是城市。即使城市名称与一个或多个单词不同,这也会起作用。
Tampa_NC_28211
_(null)_