#include<stdio.h>
int main ()
{char c[5];
scanf ("%s",&c);
printf("%s",c);}
所以我声明数组大小为5。 但是,当我输入大象这是一个8字母的单词时,它仍然会被打印出来。有人可以解释原因,并建议我应该做什么,以便计算机只接受/考虑我的输入最多5个字符。
答案 0 :(得分:0)
这是非确定性行为。数组在内存中是5个字符,但scanf不安全。它将所有8个字符放入从c [0]开始的顺序存储器中,尽管其中3个字符在技术上不是数组c的一部分。最后三个字符可能最终被其他应用程序或函数更改,因为它们不归阵列c所有。
如果使用正确的scan_s函数,则在尝试执行此操作时会抛出错误。您应该始终使用“安全”功能。
这样的任何数组实际上是指向数组第一个元素的指针,[5]表示从“c”定义的第一个内存位置偏移5个内存位置。您可以自由地将[]内的数字设置为任何偏移,尽管它可能超出您分配给c的范围。
答案 1 :(得分:0)
在C中,数组没有绑定检查。所以基本上,如果你声明一个5元素的数组,你可以在其中存储100个元素,如果你幸运的话(这里,幸运的是我的意思是不要覆盖影响程序执行的其他重要的事情),它会工作。但这是危险和错误的。您有责任确保不会发生这种情况。
答案 2 :(得分:0)
变量c被分配到堆栈中,当将空间分配到堆栈中时,编译器可能会分配比你真正需要的更多的东西,这就是为什么当你把8个字符写入函数main的堆栈时,你不要收到分段错误。
你应该改变你的代码并使用:
fgets(c, sizeof c, stdin);