C &引用;分段故障(堆芯倾倒)“;从文本文件读取单词并将其添加到列表时出错

C &引用;分段故障(堆芯倾倒)“;从文本文件读取单词并将其添加到列表时出错,c,linked-list,C,Linked List,我有一段代码试图从存储在.txt文件中的单词列表中读取一个单词 char *getWord(char *filename) { char formatstr[15], *word; static FILE *input; static int firstTime = 1; if (firstTime) { input = fopen(filename, "r"); if (input == NULL) {

我有一段代码试图从存储在.txt文件中的单词列表中读取一个单词

char *getWord(char *filename)  {
    char formatstr[15], *word;
    static FILE *input;
    static int firstTime = 1;
    if (firstTime) { 
        input = fopen(filename, "r");
        if (input == NULL) {
            printf("ERROR: Could not open file \"%s\"\n", filename);
            exit(1);
        }
        firstTime = 0;
    }
    word = (char*)malloc(sizeof(char)*WORDLEN);
    if (word == NULL) {
        printf("ERROR: Memory allocation error in getWord\n");
        exit(1);
    }
    sprintf(formatstr, "%%%ds", WORDLEN-1);
    fscanf(input, formatstr, word);
    if (feof(input)) {
        fclose(input);
        return NULL;
    }   
    return word;    
}
然后使用此代码尝试将其存储到链接列表中

struct num1* wdStr(int wdLength, char *filename)
{

    int d; // total words.
    char *wordC;

    struct num1 *head = NULL;
    struct num1 *temp;  

    d = edCount(filename);      

    for(int i = 0; i < d; i++) 
    {       
        wordC = getWord(filename);              

        if(strlen(wordC) == wdLength)
        {
            temp = (struct num1*)malloc(sizeof(struct num1));
                temp->val = wordC;
                temp->next = head;
                head = temp;
        }       
    }   
    //return head;
}
struct num1*wdStr(int-wdLength,char*filename)
{
int d;//总字数。
char*wordC;
结构num1*head=NULL;
结构num1*温度;
d=edCount(文件名);
对于(int i=0;ival=wordC;
温度->下一步=头部;
压头=温度;
}       
}   
//回流头;
}
edCount只计算有多少个单词

所以在运行程序之后,总是在最后一个字之前,我会得到一个“分段错误(内核转储)”错误。我知道我的指针有问题,但我还是找不到什么

运行程序后,总是在最后一句话之前,我得到一个“分段错误(内核转储)”

这是因为您的
getWord
在最后一个单词后返回
NULL
,但是您的
main
无条件地调用
strlen
。这会取消对
NULL
指针的引用,导致崩溃

请注意,您的代码会产生内存泄漏:您的
getWord
实现在为流结束标记返回
NULL
之前忘记释放分配的
word

注意:除非这是一个关于静力学的特定学习练习,否则使用
FILE*input
是非常值得怀疑的,因为它会使您的
getWord
无正当理由不可重入

运行程序后,总是在最后一句话之前,我得到一个“分段错误(内核转储)”

这是因为您的
getWord
在最后一个单词后返回
NULL
,但是您的
main
无条件地调用
strlen
。这会取消对
NULL
指针的引用,导致崩溃

请注意,您的代码会产生内存泄漏:您的
getWord
实现在为流结束标记返回
NULL
之前忘记释放分配的
word


注意:除非这是一个关于静态的特定学习练习,否则使用
FILE*input
是非常值得怀疑的,因为它会使您的
getWord
无正当理由不可重入。

getWord在eof情况下返回NULL,您似乎没有处理它

对于eof案例,getWord返回NULL,您似乎没有处理它

使用调试器很容易解决这个问题。您正在哪个操作系统上运行?您正在从两个函数返回本地指针。从函数返回后,它们超出范围,因此行为未定义。@Dipto:没有问题;指针是通过
malloc()
初始化的,所以这不是问题。@JonathanLeffler,是的,忽略了这一点。这很容易用调试器解决。您正在哪个操作系统上运行?您正在从两个函数返回本地指针。从函数返回后,它们超出范围,因此行为未定义。@Dipto:没有问题;指针是通过
malloc()
初始化的,所以这不是问题。@JonathanLeffler,是的,忽略了这一点。我知道内存泄漏,但我只是想先解决这个问题。知道getWord在eof时给出NULL,我也尝试添加这个if(wordC==NULL)返回头;在if(strlen(wordC)==wdLength)之前,但我仍然得到相同的结果error@green_leaf当
wordC
NULL
时返回应该可以正常工作。新的崩溃可能来自调用您的
wdStr
函数的其他地方。事实上,您应该知道正确的地方。是的,事实上,我必须使用getWord,但不幸的是不能修改它,包括内存泄漏。我知道内存泄漏,但我只是想先解决这个问题。知道getWord在eof时给出NULL,我也尝试添加这个if(wordC==NULL)返回头;在if(strlen(wordC)==wdLength)之前,但我仍然得到相同的结果error@green_leaf当
wordC
NULL
时返回应该可以正常工作。新的崩溃可能来自调用您的
wdStr
函数的其他地方。事实上,您应该知道正确的地方。是的,实际上我必须使用getWord,但不幸的是,我没有修改它,包括内存泄漏。