【问题标题】:Program Segfaults in between 2 printf()'s在 2 个 printf() 之间的程序段错误
【发布时间】:2014-08-13 11:52:17
【问题描述】:

希望有人可以提供帮助。我让这个程序完美运行,将几行代码从一个函数移到另一个函数,结果一切都崩溃了。

我在函数顶部添加了一个 sn-p,直到出现段错误。它高兴地输出“我们到了吗?”但不是下一个声明,我花了很多时间试图弄清楚这一点,以至于我不记得我必须开始的工作构建

它(至少是下面的部分)应该将整个文本文件复制到一个字符串

故事的寓意:工作代码比“正确”代码更好,在尝试调整之前总是复制工作代码。

void validateFile(FILE* file, char** menuStore, char** submenuStore)
{

    char* temp = NULL;
    size_t size;
    boolean flag = true;
    char first;

    /*Loop Counter*/
    int i;

    fseek(file, 0, SEEK_END);
    size = ftell(file) * sizeof(char);
    fseek(file, 0, SEEK_SET);

    if ((temp = malloc(size)) == NULL)
    {
        printf("\nUnable to allocate Memory, Program exiting");
        exit(EXIT_FAILURE);
    } else
    {
        for (i = 0; i < (size / sizeof(char)); i++)
        {
            temp[i] = fgetc(file);
        }

        printf("\n did we get here?");
        printf("\nFile loaded, validating...");

【问题讨论】:

  • sizeof(char) 始终为 1
  • 将换行符 last 放入要打印的字符串中。请记住,默认情况下,stdout 的输出是行缓冲的,因此无论在那一秒 printf 之后发生的任何事情,在您打印换行符(或显式刷新缓冲区)之前,您都不会看到文本。
  • 对于崩溃,总是在调试器中运行您的崩溃程序。调试器将停在崩溃的位置,让您检查并向上走函数调用堆栈。
  • @JoachimPileborg 谢谢你,我原以为我的一位导师会在过去 4 年的某个时候提到这一点......我现在会看看那之后的东西并继续挖掘。

标签: c segmentation-fault ansi fgetc


【解决方案1】:

从文件中读取时,您不应该使用这样的循环-

for (i = 0; i < (size / sizeof(char)); i++)
{
    temp[i] = fgetc(file);
}

您应该在读取文件时检查EOF 条件-

i=0;
while((temp[i]=fgetc(file))!=EOF)
     i++;

并将字符串结束为\0。这是更好的方法。

temp[i]='\0';

【讨论】:

  • 感谢 Sathish,Joachim 让我意识到错误发生在哪里,我正在调用 strcpy() 一个非 NUL 终止的字符串(在代码中更进一步)感谢所有帮助人员:)
  • @DavidFrye 实际上我今天早些时候才读到。如果我已经准备为我的 malloc 使用确切的文件大小/字符串长度,我不妨使用 for()(只需在长度上添加 +1 并在我 strcpy 之前添加 /0)跨度>
  • 我并不是说该技术总是是错误的(尽管答案本身是错误的),我只是想我会发布它,因为它是相关的(我只是今天也读一下!)。
  • 不是检查EOF的正确方法。 fgetc() 返回 unsigned charEOF。此方法将EOF 折叠成存储在temp[i] 中的256 个值之一。取而代之的是int ch; while((ch=fgetc(file))!=EOF) { temp[i] = ch; ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多