C &引用;分段故障(堆芯倾倒)“;从文本文件读取单词并将其添加到列表时出错
我有一段代码试图从存储在.txt文件中的单词列表中读取一个单词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) {
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,但不幸的是,我没有修改它,包括内存泄漏。