我在getc()中有一个从文件读取的分段错误

时间:2014-11-09 04:09:55

标签: c++ c algorithm hash segmentation-fault

void CalculateWordFrequency(char* inputFile){

    char* word= malloc(sizeof(char)*32);
    char ch;
    int count, letters=0, value;
    FILE *file = fopen (inputFile, "r");

    Hashtable* table = malloc(sizeof(table));
    Init(table);



    if ( file != NULL )
    {
        while((ch=getc(file))!=EOF)
        {
        word[0] = ch;
        word++;
        letters++;
        if(isalpha(ch)!= 0){

            word[0] = 0;
            word - letters;
            letters = 0;
            value = HashKey(word,table);
            Put(word ,value,table);


        }
        printf("%c", ch);

    }
}else{
    perror ( inputFile ); /* why didn't the file open? */

}    

}

我正试图从.txt文档中获取单词并制作包含所有单词和出现次数的哈希表...

我担心的是getc()正在读取一个无效字符并给我一个分段错误。 文件中的一些文字:

哈希表 维基百科,自由的百科全书 不要与哈希列表或哈希树混淆。 哈希表 键入无序关联数组 发明于1953年 时间复杂 在大O符号     平均最坏情况 空间O(n)[1] O(n) 搜索O(1)O(n) 插入O(1)O(n) 删除O(1)O(n) 一个小电话簿作为哈希表。

和错误: 哈希表 来自维基百科,免费的百科全书

编程接收信号SIGSEGV,分段故障。 来自/lib64/libc.so.6的getc()中的0x000000321dc67f3e

1 个答案:

答案 0 :(得分:2)

问题源于这一行:

word++;

继续递增单词指针,然后永远不会重置回缓冲区的开头。所以最终word指向超过分配的32个字节。

我猜你打算用行重置指针:

word - letters;

但是这句话没有效果。相反,你应该使用:

word -= letters;

其他(在我看来更安全)处理此问题的方法可能是使用索引(例如word[letters])并保持word不变或定期从指向开头的另一个常量指针重置指针缓冲区。