【问题标题】:Scanf fails with bus errorScanf 因总线错误而失败
【发布时间】:2010-06-06 17:52:42
【问题描述】:

我在玩 C 并且遇到了这个错误:

#include <stdio.h>
int main ()
{
 char* foo;
 scanf("%s", foo);
 printf("entered %s", foo);
 return 0;
}

scanf 接受指针,foo 是指针,但我得到总线错误。我怎样才能让它发挥作用?

【问题讨论】:

  • 这是一个常见问题解答 - 你想要char foo[SOMESIZE];
  • 不,你没有。但是,如果您认为可以,char * foo = malloc( SOMESIZE );
  • 你这样做的方式永远不会安全。这是通向不安全和脆弱的 C 程序的道路,而 C 也因此而臭名昭著:无论分配给 foo 的大小如何,程序的用户总是会溢出它并导致程序崩溃。请改用fgets。 (注意:这不是你的错,初学者很难看出哪些功能可以安全使用)

标签: c pointers scanf bus-error


【解决方案1】:

你永远不会初始化foo,所以它指向内存中或多或少的随机位置。要么在堆栈上分配它。

char foo[10];

或者在堆上 malloc:

char *foo = (char *)malloc(10 * sizeof(char));

但是如果你 malloc,别忘了 free()。

并注意缓冲区溢出;如果某些东西占用了缓冲区但没有最大大小,请非常小心。例如,您可以通过 %9s 指定 scanf 的最大长度。不过,scanf 不会考虑终止的 null,因此您需要传递比缓冲区长度小 1 的值。

【讨论】:

  • 还要注意,您必须分配足够的空间来存储scanf读入的字符串。如果您只分配一个字符,则如果您输入除空字符串之外的任何内容,您将获得未定义的行为(可能是段错误)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多