【问题标题】:Why does this C-code work? [duplicate]为什么这个 C 代码有效? [复制]
【发布时间】:2013-02-14 17:22:39
【问题描述】:

为什么我可以在数组 "char array[3]" 中存储超过 3 个字符? 例如,在这段代码中:

#include <stdio.h>

char array[3];

main()
{
scanf("%s", array);
putchar(array[5]);
return 0;
}

您可以输入任意长度的文本,它将打印第 6 个字母。你也可以用"printf("%s", array) 打印整个文本。为什么这个数组只有3个字符的空间?

【问题讨论】:

标签: c arrays string char scanf


【解决方案1】:

您的代码能够打印整个单词,因为它还没有被覆盖。您正在设置内存,然后立即从中读取。如果您稍后在程序执行时尝试从该内存位置读取,您可能会得到完全不同的结果。

这是未定义的行为......在你的情况下,它打印了“正确”的输出。

【讨论】:

  • 也许,也许不是。这就是为什么这些错误是最糟糕的一种......
  • 谢谢!这是否意味着数组的元素存储在连续的内存地址中?如果不是,它怎么知道在哪里找到数组的元素?
  • @Thomas 它在字符串的末尾找到空终止符。
【解决方案2】:

array 被定义为一个全局数组,因此通常是.bss 部分的一部分。由于您系统的 .bss 部分有足够的内存,您可以写入相同的内容。显然,当您超出此部分的大小时,就会发现这是一种违规行为。

【讨论】:

    【解决方案3】:

    由于 scanf() 的工作方式,它只会继续将发送给它的内容写入内存。因为您是在写入后立即读取,所以数组使用的额外内存尚未被覆盖,因此您可以读取整个字符串。
    C 中还有其他函数会限制您的输入,例如 fgets()。

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      相关资源
      最近更新 更多