使用malloc在排序名称时不断出现seg错误



我假设读取一个文件,然后在按字母顺序排序的数组中写入该文件。然而,我一直在使用gdb时遇到分割错误,这表明我的显示和排序功能出现了分割错误。

编辑:我通过使用宏来分配内存来修复它。由于这是一项任务,我不想透露,以防万一。我非常感谢大家对我代码的帮助。

你应该这么做吗?哎哟

我也有一个segfault,但在read_names()中。我通过用一个简单的scanf():替换所有strtok()的东西来修复它

void read_names (FILE *fp, char **f, char **l, char *m, int num)//read it
{
int i=0;
char temp[80];
for (i=0; i<num; i++)
{ 
fscanf( fp, "%s %s %s", f[i], l[i], m);
}
} 

在那之后,我能够对&打印,尽管它试图在最后错误地释放()一些东西。

一般来说,strtok()是不安全的,只是一种痛苦——它会破坏你的字符串。

此外,更有意义的名称使其更易于使用。我最终发现"l[]"是一个包含姓氏的字符串数组,但类似于"sLastName[]"的东西会大大加快速度。

编辑:

我收集了你的输入文本文件,看起来像这样:

2 bill smith a doug adams r

第2版:

好的,找到了另一个segfault。什么是"num"?它似乎被解释为文件中名称的数量和每个名称的大小?

// allocate "num" first name elements -> implied "num" is # of names
f=(char**)malloc (num*sizeof(char*));
// allocate space for each name... but uses the value of "num" for each name
for (i=0; i<num;i++)
f[i]=(char*)malloc (num*sizeof(char));  // "num" bytes per name?

当我开始为每个名称分配100个字节而不是"num"的值时,第二个——对我来说也是最后一个——segfault就消失了。

你是否进入了整个程序,然后开始测试?让它在小步骤中工作,然后逐步添加功能会容易得多——用调试器和/或printf()验证它在每一步都在做你想要的事情。

最新更新