C奇怪的编译器行为

时间:2014-01-04 15:07:42

标签: c compiler-construction mingw

对于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的新手。

2 个答案:

答案 0 :(得分:2)

因此,char c;中的局部变量getNextWord()未初始化

中的初步测试
while(c != ' ')

是未定义的行为。你应该初始化,例如如

char c = 0;

答案 1 :(得分:2)

你正在释放错误的指针,导致未定义的行为。

您需要free(q),而不是w,因为w不再指向malloc返回的内容。