新的C,分段错误?

时间:2014-02-10 17:01:33

标签: c scanf

我在这段代码中看到错误。在fscanf中,需要引用缓冲区的地址(& buffer)。有人可以解释错误"分段错误"?我是新手用gcc编译的东西,我不明白它试图告诉我什么。

int buffer;
char junk;
while(fscanf(fp,"%d%c",buffer, &junk) !=EOF)
{
printf("%d\n",buffer);
}
fclose(fp);

return 0;
}

4 个答案:

答案 0 :(得分:17)

我注意到没有一个答案实际上解决了你的问题:

  

有人可以解释错误“分段错误”吗?

在C中编写具有“未定义行为”的程序非常容易。你这样做了。具有未定义行为的程序可以逐字地执行任何。它可以进入无限循环。它可以给出分段错误。它可以正常工作。将文件通过电子邮件发送到朝鲜后,它可以清除您的硬盘。它可以任何

未定义行为的一个非常常见的症​​状是分段错误。基本上这意味着你编写了一个程序未定义的行为,你很幸运。您的程序尝试访问它无权访问的内存。而不是删除您的硬盘,操作系统会给您一个分段错误。每次遇到分段错误都应该感谢;它可能会变得更糟,更糟糕。 seg故障会引起对错误的注意,以便您可以轻松修复它。

具体来说,这里发生的是:

  • buffer未初始化为任何值。它的值可以是任何合法的整数。
  • fscanf需要一个指针。指针具有以下属性:当取消引用时,它们变成变量。指针通常实现作为整数,将地址存储到变量的内存位置。 (请注意,指针不是必需这样实现,但它是一种常见的选择。)
  • 而不是指针,你给fscanf一个整数,它将其解释为指向存储位置的指针。但整数包含任何可能的整数值
  • 操作系统维护已知正在使用的内存页面列表。如果buffer碰巧有一个值,当被解释为指针时,恰好引用一个未使用的页面,那么当fscanf试图转向时,操作系统将产生一个seg错误指针指向存储位置。

现在想想在其他情况下会发生什么。 buffer可能碰巧包含一个整数,当它被解释为指针时会生成一个有效的内存地址,并且该有效内存地址可能恰好包含当前方法的返回地址。由fscanf放入该位置的值可能恰好是“格式化硬盘”库例程的地址。在这种情况下,你不会得到分段错误;相反,当当前方法返回时,它将格式化您的硬盘而不是终止程序。同样,请确保您理解这一点:未定义的行为可以完全做任何事情

大多数情况下,您会很幸运,并且会出现分段错误。不要依赖这个安全网!不要首先编写未定义的行为。

作为历史记录,术语“分段错误”来自操作系统将内存“分段”为代码,数据等部分的常见做法。操作系统当然没有要求这样做,但大多数现代操作系统使用某种形式的分段来帮助捕获这些错误。

答案 1 :(得分:6)

你很亲密..

fscanf(fp,"%d%c",&buffer, &junk)

答案 2 :(得分:2)

& buffer之前您错过了fscanf运营商。

答案 3 :(得分:0)

当它是地址问题时,你有两种可能性;定义一个指针:在这种情况下为int * buffer,对于那种情况,缓冲区就可以了。 但是,如果您使用常规变量,则必须通过添加运算符'&'来提供其地址。 其次,我看到你使用了名为“fp”的变量。我在代码中找不到该变量的定义。