使用malloc在排序名称中继续获得seg错误

时间:2012-11-14 00:04:20

标签: sorting segmentation-fault malloc

我想读取一个文件,然后以字母顺序排序的数组写入该文件。但是,我一直在使用gdb获取分段错误,表明我的显示和排序功能发生了分段错误。

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

1 个答案:

答案 0 :(得分:1)

你应该这样做吗?哎哟。

我也有段错误,但在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);
        }
    } 

之后,我能够排序&amp;打印,虽然它试图在最后错误地释放()某些东西。

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

此外,更有意义的名称使其更容易使用。我最终发现“l []”是一个包含姓氏的字符串数组,但是“sLastName []”中的某些内容会极大地加速。

编辑:

我收集了你的输入文本文件,如下所示:

2 bill smith a doug adams r

EDIT2:

好的,发现了另一个段错误。什么是“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”的值时,第二个 - 对我来说最后一个 - 段错误消失了。

您是否输入了整个程序然后开始测试?让它以小步骤工作然后逐步添加功能会更容易 - 用调试器和/或printf()验证它在每一步都做你想做的事。