对于C.的MingW编译器,我有一些相当奇怪的行为 我有一个名为getNextWord的函数,如下所示:
void getNextWord(FILE * pFile)
{
char * w = (char *)malloc(MAX_WORD_SIZE * sizeof(char *));
char * q = w;
char c;
while(c != ' ')
{
c = fgetc(pFile);
if(c != ' ')
{
*(w++) = c;
}
}
*(w++) = '\0';
printf("%s\n",q);
free(w);
}
出于某种原因,当我尝试连续两次调用此函数来打印两个单词时,它不起作用。但奇怪的是,如果我在函数调用之间放置任何东西,包括printf或fseek,那么函数就像你期望的那样工作。
这有效:
int main(int argc, char** argv) {
FILE * pFile = fopen("doc.txt", "r");
getNextWord(pFile);
printf("a");
getNextWord(pFile);
fclose(pFile);
return (EXIT_SUCCESS);
}
这不起作用:
int main(int argc, char** argv) {
FILE * pFile = fopen("doc.txt", "r");
getNextWord(pFile);
getNextWord(pFile);
fclose(pFile);
return (EXIT_SUCCESS);
}
有没有人知道为什么会这样?
编辑: 感谢您的帮助,这是固定功能:
void getNextWord(FILE * pFile)
{
char * w = (char *)malloc(MAX_WORD_SIZE * sizeof(char));
char * q = w;
char c;
do
{
c = fgetc(pFile);
if(c != ' ')
{
*(w++) = c;
}
} while(c != ' ');
*(w++) = '\0';
printf("%s\n",q);
free(q);
}
很抱歉原帖中的所有错误,我是C的新手。
答案 0 :(得分:2)
因此,char c;
中的局部变量getNextWord()
未初始化
while(c != ' ')
是未定义的行为。你应该初始化,例如如
char c = 0;
答案 1 :(得分:2)
你正在释放错误的指针,导致未定义的行为。
您需要free(q)
,而不是w
,因为w
不再指向malloc
返回的内容。