2013-10-17 50 views
0

这是一些有经验的C用户的任务。极难找到的错误。分割错误 - C语言

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

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

我已经链接下面的pastebin.com中的代码。该代码编译,因为它是:

http://pastebin.com/fJyUQBfM

下面是这个程序运行沿一个文本文件:

http://pastebin.com/JVsb9gGL

只需复制并粘贴所有到一个txt文件并运行那个可执行文件。

该程序适用于电子邮件数量有限的小文件,但对于包含数百万封电子邮件的非常长的文件,我会在该行发现段错误。

如果你运行valgrind a.out它会给你关于seg故障的信息。

感谢您的帮助。

+0

'“%49 [^ @] @%49s - >%49 [^ @] @%49s”'这到底是什么? – Havenard

+0

为什么所有尺寸都设置为“MAX_LEN + 1”?你为什么不把MAX_LEN放大1,所以你可以在每个地方使用MAX_LEN? – Barmar

+0

@Havenard - 大声笑,这是我的scanf转换说明符。49是为了确保字符串的最大长度不超过50个字符,并且有4个字符串变量正在尝试读取。格式是这样的:[email protected] - > [email protected] – user2817240

回答

0

我看到的是,nodes_list单独需要109,11 MB内存的固体块,edges_list需要更多214,01 MB,另一个需要109,11 MB。

500 MB的内存不是很多,但您可能无法以此大小的块进行分配。如果您使用malloc()则会失败。你最终会写信给你不应该的地方,因此会出现段错误。您应该使用链接队列。检查my answer to this other question知道如何做到这一点。

另外,我发现了一些不相关的段错误,但你必须例如:

Node sender; 
Node nodes_list[MAX_NODE_LEN + 1]; 

然后你做:

nodes_list[nodes_list_index] = sender; 

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

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

此外,您声明了您的列表,以便它可以包含多达550,000对发件人/收件人。你说这个清单又是多大?

+0

我以不同的方式实现它。我重写了sender.email并使用strcpy将新邮件复制到sender.email,然后将发件人节点添加到整个数组中。 – user2817240

+0

不管怎样,对于这个项目,我们不允许使用内存分配,malloc,calloc等,我们只能使用数组。那么你能解决这个问题吗? – user2817240

+0

边缘阵列最多可容纳40,000对接收器+发送器。我想让阵列足够大以容纳足够大的文件。 – user2817240