【问题标题】:curious behaviour of scanfscanf 的奇怪行为
【发布时间】:2011-02-02 22:17:20
【问题描述】:

我意识到这段代码有问题。 但是,我遇到了一些奇怪的行为,我想知道是否有人可以解释一下。

示例 1:

   char *foo;
   scanf("%s",foo);
   printf("%s",foo);

输出为:(null)

示例 2:

  int i;
  char *foo;
  scanf("%s",foo);
  printf("%s",foo);

输出为:foo 的值

为什么 int i 的存在会导致它“工作”?

【问题讨论】:

  • 它不起作用。它似乎恰好按照您的预期做,但它是未定义的行为,因此是一个严重的错误。
  • 从您发布的内容来看, foo 没有任何价值。它是指向一块未分配内存的指针。
  • 我想在你自己的程序中发现这种错误会很烦人。 ;)
  • 即使你确实知道它是如何“应该”工作的,使用 %sscanf 是完全不安全的,并且没有合法的使用。您不知道缓冲区需要多大。没有办法知道。这将始终是缓冲区溢出。

标签: c scanf


【解决方案1】:

foo 是一个指针,但您没有将它设置为指向您分配的任何内存,因此它在启动时只是具有随机值,因此指向内存的某个随机部分。因此,任何事情都可能发生(即未定义的行为)。

int i 的存在只是改变了foo 在堆栈中的位置,从而改变了它所具有的特定随机值。你不应该从这种不同的行为中解读出任何有意义的东西,因为它仍然是未定义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多