Io 极难找到的bug。C语言中的分段错误

Io 极难找到的bug。C语言中的分段错误,io,segmentation-fault,buffer,fgets,Io,Segmentation Fault,Buffer,Fgets,下面是一些有经验的C用户的任务 所以我花了很长时间试图检测代码中的这个bug。我在第158行(fgets()函数)处遇到一个分段错误。我不知道那是什么。我运行valgrind,我似乎无法理解它所说的内容 这是一个棘手的错误。如果你对C语言有经验,如果你能帮我找出问题所在,我将不胜感激 我已经在下面的pastebin.com中链接了代码。代码可以编译,因为它是: 以下是与此程序一起运行的文本文件: 只需将所有内容复制并粘贴到一个txt文件中,然后使用该文件运行可执行文件 该程序适用于电子邮件数

下面是一些有经验的C用户的任务

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

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

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

以下是与此程序一起运行的文本文件:

只需将所有内容复制并粘贴到一个txt文件中,然后使用该文件运行可执行文件

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

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


谢谢你的帮助。

我看到的是,
节点列表
本身就需要一块109,11MB的内存,
边缘列表
需要更多214,01MB的内存,而
节点列表
又需要109,11MB的内存

500 MB的内存不是很多,但您可能无法分配这种大小的块。如果您使用的是
malloc()
,它将失败。你最终会写信到某个你不应该去的地方,这就是错误。您应该改用链接队列。检查以了解如何做到这一点

此外,我注意到一些与segfault无关的内容,例如:

Node sender;
Node nodes_list[MAX_NODE_LEN + 1];
然后你会:

nodes_list[nodes_list_index] = sender;
我不确定你认为这里发生了什么,但这是错误的。你不能那样做。如果要通过
发送方的内容覆盖
节点列表[节点列表索引]
,则应使用
memcpy()
,如下所示:

memcpy(&nodes_list[nodes_list_index], &sender, sizeof(Node));
或者直接向
节点列表[nodes\u list\u index]发送电子邮件
,而不是使用
发件人
作为中间人


此外,您声明了您的列表,以便它最多可以包含550000对发送方/接收方。你说那个列表又有多大了?

%49[^@@@%49s->%49[^@@@%49s->%49[^@@@%49s”
这到底是什么?为什么所有的东西都是
最大长度+1
?你为什么不把
MAX_LEN
放大1,这样你就可以到处使用
MAX_LEN
?@Havenard-LOL,那是我的scanf转换说明符。49用于确保字符串的最大长度不超过50个字符,并且有4个字符串变量正试图读取。格式如下:a@ex.com -> b@ex.com@巴尔马-我想这是出于惯例和习惯。我就是这样被教导的。无论如何,这与主要问题不同。我以后会担心风格的问题。请发布valgrind的输出。我们不应该做所有的工作来调试你的程序。我用不同的方式实现了它。我重写了sender.email并使用strcpy将新电子邮件复制到sender.email,然后将sender节点添加到整个数组中。无论如何,对于这个项目,我们不允许使用内存分配、malloc、calloc等,我们只能使用数组。你能解决这个问题吗?edges阵列可以容纳多达40000对接收器和发送器。我想让数组足够大以容纳足够大的文件。也许你可以将列表存储到一个文件中,而不是保存在内存中。您可以简单地将整个节点以二进制模式写入文件,然后在处理完输入后逐个读取它们。