0

这是一些有经验的 C 用户的任务。

所以我花了很长时间试图检测我代码中的这个错误。我在第 158 行遇到了分段错误,即 fgets() 函数。我不知道它是什么。我跑了 valgrind,但我似乎无法理解它在说什么。

这是一个棘手的错误。如果您有 C 语言经验,如果您能帮助我找出问题所在,我将不胜感激。

我在下面的 pastebin.com 中链接了代码。代码是可编译的,因为它是:

http://pastebin.com/fJyUQBfM

这是与该程序一起运行的文本文件:

http://pastebin.com/JVsb9gGL

只需将所有内容复制并粘贴到 txt 文件中,然后运行可执行文件即可。

该程序适用于电子邮件数量有限的小文件,但对于包含数百万封电子邮件的极长文件,我在该行遇到分段错误。

如果您运行 valgrind a.out,它将为您提供有关 seg 错误的信息。

谢谢你的帮助。

4

1 回答 1

0

我看到的是,nodes_list仅此一项就需要 109,11 MB 的内存,edges_list需要更多的 214,01 MB 和in_degree_list另外 109,11 MB。

500 MB 的内存不是很多,但您可能无法分配这种大小的块。如果你使用malloc()它会失败。你最终会写到你不应该写的地方,因此是段错误。您应该改用链接队列。检查我对这个其他问题的回答,以了解如何做到这一点。

另外,我注意到一些与段错误无关的东西,但你有例如:

Node sender;
Node nodes_list[MAX_NODE_LEN + 1];

然后你做:

nodes_list[nodes_list_index] = sender;

我不确定您认为这里发生了什么,但这是错误的。你不能这样做。如果你想nodes_list[nodes_list_index]被 的内容覆盖sender,你应该使用memcpy(),像这样:

memcpy(&nodes_list[nodes_list_index], &sender, sizeof(Node));

或者干脆直接写入nodes_list[nodes_list_index].email而不是sender用作中间。

此外,您声明了您的列表,因此它可以包含多达 550,000 对发送者/接收者。你又说那份名单有多大?

于 2013-10-17T00:23:14.847 回答