【问题标题】:fprintf causes console application to crashfprintf 导致控制台应用程序崩溃
【发布时间】:2013-06-27 19:52:05
【问题描述】:

我正在调试 fprintf 的一个问题。我希望你们能给我一些建议,或者即使这是一个简单的问题,也可以帮助我识别它。我的代码如下。

        while(fgets(buffer, 500, filep) != NULL){
        //printf("%d\n", i);
        strcpy(result, buffer);
        result = strtok(result, " ,()[]\'");
        //printf("%s\n", buffer);
        while(result != NULL){
            //printf("%s\n", buffer);
            if(stricmp(result, strng) == 0){
                //printf("found!!\n");
                printf("%s\n", buffer);
                fprintf(Compilation, "%s", buffer);
                //printf("%s", result);
            }
            result = strtok (NULL, " ,()[]\'");
        }
        result = (char*)realloc(result, 500);
    }

我知道这很麻烦,甚至可能不是最好的解决方法,但这是我所拥有的。缓冲区和结果最初分配了 1024 个字节。解析每一行后,如果在该行中找到一个字符串,则将整行附加到一个新文件中。我知道记忆很混乱,所以我仍在努力收紧它。我的问题是 fprintf 将运行多行,并且有时它会碰到一行并使应用程序崩溃。当我在 IDE (VSexpress2012) 中使用 printf 行调试此问题时,我看到 printf 在 fprintf 停止打印到文件后实际上打印了许多行。任何帮助将不胜感激。

【问题讨论】:

  • 请注意,文件输出是缓冲的。如果您的程序崩溃,您使用 fprintf 打印的某些内容可能仍在缓冲区中等待,并且在文件中不可见。您可以使用 fflush(Compilation); 来刷新缓冲区。在 fprintf 行之后添加。
  • 空字符串 "" 不等于 NULL。为了进一步澄清,您应该显示缓冲区和结果是什么。你应该展示更多你的代码。
  • 您需要显示更多代码。如果您可以制作一个小而完整的程序来重现您的问题,那将是完美的。
  • fprintf() 有一个返回值,你可以检查它是否写入失败。同样,您可以检查 errno 的值。

标签: c debugging memory-management printf


【解决方案1】:

您不能将任意指针传递给realloc。问题是strtok 修改了result 指针,然后您尝试使用此指针reallocrealloc 需要从 malloc 返回的原始指针。

【讨论】:

  • 我该如何解决这个问题?我是否在使用 strtok 之前将 &result 保存到 int 中,然后在重新分配之前将 &result 分配回 int?
  • 你为什么要使用 realloc?在任何情况下,您只需将strtok 的返回值保存到不同的变量。永远不要修改 result 指向的内容,除非您不打算再次使用它,并且使用当前代码,您将重新使用它。
猜你喜欢
  • 2017-08-02
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2016-06-04
  • 2011-08-24
相关资源
最近更新 更多