字典文件崩溃但编译正常

时间:2017-02-25 02:15:59

标签: c dictionary

大家好我正在尝试为一些课程实施拼写检查,但我是C的新手,只是加载字典文件正在毁了我的脑袋。以下代码编译正常,但在运行时崩溃。有时打印500行有时1500,但我不知道是什么原因导致它!

#include <string.h> 
#include <stdio.h> 
#include <malloc.h>

int main(int argc, char *argv[]) 

{
FILE *words_ptr;    //pointer for words.txt

char new_word[100];
char temp_word[100];
char *dict[45440];
words_ptr = fopen( "dictionary.txt", "r" );
if(words_ptr != NULL )
{
    printf( "File dictionary.txt opened\n");
    int i = 0;
    while (fgets(temp_word, 45440, words_ptr)) 
    {
        new_word[i] = (char)calloc(strlen(temp_word), sizeof(char)); //ensuring new_word will be the right size
        strcpy(new_word, temp_word);     //copy contents of temp_word to   new_word
        dict[i] = new_word;               //copy contents of new_word to i'th element of dict array
        printf("printing out dict[%d]: %s\n", i, dict[i]); 
        i++;
    }  
    printf("printing out dictionary1: %s\n", dict[1]);

    fclose( words_ptr );
    return 0;
}
else {printf( "Unable to open file words.txt\n" ); return 1;}

}

2 个答案:

答案 0 :(得分:3)

根据手册页, calloc()函数为每个nmemb(第一个参数)元素的size(第一个参数)元素数组分配内存,并返回指向分配的内存。内存设置为零。

您基本上是将指针指向char并进一步将其指定给char,这没有任何意义。不要将new_word声明为char数组,而是将其设为char *并执行calloc,如下所示:

char *new_word;
...
new_word = calloc(strlen(temp_word) + 1, sizeof(char));

答案 1 :(得分:2)

这一行:

<a href="javascript:void(0)" onclick="return countredirect();">Item</a>

没有提供足够的空间来复制字符串。这个字节太短,因为new_word[i] = (char)calloc(strlen(temp_word), sizeof(char)); //ensuring new_word will be the right size 不包含终止strlen()字符。

此外,'\0'只有100 new_word个条目的空间 - 它甚至不是char。这完全是无关紧要的。只需将char *的结果直接保存到calloc()

dict[i]

是的,有一个名为dict[i] = strdup( temp_word ); 的函数重复一个字符串。 Animated line drawing in SVG