【问题标题】:Segmentation fault: 1902 vfscanf.c: No such file or directory分段错误:1902 vfscanf.c:没有这样的文件或目录
【发布时间】:2018-03-31 17:09:05
【问题描述】:

程序在scanf() 函数处因分段错误而停止。 这是简化的代码:

int main() {
  int x = 0;
  printf("$ ");
  scanf("%i", x);

  return 0;
}

当我使用gdb 运行它时,我收到了这条消息:

(gdb) run
Starting program: /home/siery/dev/shell/classes/bin/Recure 

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff71f6794 in _IO_vfscanf_internal (s=<optimized out>, format=<optimized out>, argptr=argptr@entry=0x7fffffffe608, errp=errp@entry=0x0) at vfscanf.c:1902
1902    vfscanf.c: No such file or directory.

我尝试在 Internet 上搜索 vfscanf.c,但没有找到很多有用的信息。

顺便说一句。我用新更新的g++编译这个程序,和gdb一样。

【问题讨论】:

  • scanf("%i", &amp;x); 您需要传递 X 的引用,而不是值
  • 这只是gdb 告诉您它无法向您显示发生段错误的确切位置的源代码(因为您没有标准的来源系统上的库)。这与段错误的原因无关,这是@cleblanc所说的。
  • 您无需花时间搜索C标准库函数源代码。您可以假设错误就在您身边。函数名称是调试器的一个很好的提示,哪个函数被错误地调用了。
  • 在此过程中,如果这是您的第一次尝试,我预计会很痛苦:1.) scanf() 大部分时间isn't the way to read user input。 2.) "我用 g++ 编译这个程序" 不同的 语言,所以这是一个非常糟糕的主意跨度>
  • @Felix "非常糟糕的主意 (tm)"

标签: c segmentation-fault gdb


【解决方案1】:
scanf("%i", &x);
//          ^ THIS IS THE IMPORTANT BIT

gcc 甚至会告诉你:

foo.c: In function ‘main’:
foo.c:6:9: warning: format ‘%i’ expects argument of type ‘int *’, but argument 2 has type ‘int’ [-Wformat=]
   scanf("%i", x);
         ^

vfscanf.c: No such file or directory 只是 gdb 抱怨它找不到scanf 的源代码。

【讨论】:

  • 我的投票是默认情况下使警告致命。这将极大地帮助新程序员。一旦他们有足够的经验了解应该忽略哪个警告,他们也将有足够的经验来关闭 warning=fatal 选项
  • 如果你想对每个人都这样做,echo 'alias gcc="gcc -Werror"' &gt;&gt; /etc/bash.bashrc。如果你想自己动手,echo 'alias gcc="gcc -Werror"' &gt;&gt; ~/.bashrc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 2013-08-08
  • 2013-11-04
  • 2012-02-18
  • 2012-10-21
相关资源
最近更新 更多