【问题标题】:C Weird compiler behaviorC 奇怪的编译器行为
【发布时间】:2014-01-04 15:07:41
【问题描述】:

我在 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 新手。

【问题讨论】:

  • 可能跑题了,但char * w = (char *)malloc(MAX_WORD_SIZE * sizeof(char *)); 有点不对——你需要sizeof( char ) 而不是sizeof( char* )
  • 我刚刚注意到,到目前为止,您从未“接受”过答案。请查看"How does accepting an answer work?"。您应该接受其中一个答案,而不是将解决方案放入您的问题中。您也可以发布自己的答案并接受它。 “接受”答案(通过单击复选标记)将问题标记为已解决(并为您和答案的作者提供一些声誉点)。 - 请检查您的问题并检查您是否可以接受答案。
  • 欢迎来到 StackOverflow!您能不时考虑accepting 一个有用的答案吗?您的历史显示您有 16 个问题没有这样做,这表明您不知道该选项。

标签: c compiler-construction mingw


【解决方案1】:

getNextWord()中的局部变量char c;没有初始化,因此 初始测试

while(c != ' ')

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

char c = 0;

【讨论】:

  • 这很奇怪,它当时完全有效。如果只调用一次,为什么它会起作用,而不是两次?
  • 啊——很有可能clast 值(通常是' ')仍在堆栈中,处于相同位置。在两者之间调用另一个函数会破坏堆栈。
【解决方案2】:

您释放了错误的指针,导致未定义的行为。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多