void go()
{
//{1}
char buffer[2];
gets(buffer);
//{2}
cout << allow;
}
我试图在两种情况下运行上述程序:
-1st:我宣布&#34; int allow;&#39;在第1位
-2nd:我宣布&#34; int allow;&#39;在第2位
在这两种情况下,当我试图输入字符串&#34; 123&#34; (不带引号),允许值为51。 但是,当我读到有关内存布局时,仅在第一种情况下,&#34;允许&#34;在堆栈中是在缓冲区之前,这意味着当字符串比缓冲区长时,&#34;允许&#34;改变了。
然后,我试图宣布&#34; char sth [10]&#34;两个位置。这一次,只有当我在第一个位置宣布某个位置时,它的值才会改变。
有谁可以解释发生了什么?
答案 0 :(得分:3)
由于通过溢出更改allow
为Undefined Behavior,编译器甚至可能根本没有变量allow
,而是在编译优化时将代码更改为cout << 0
。无论您将allow
置于何处, 都是检查溢出的有效方法。
要强调:您观察到的allow
的所有变化都是UB的结果。标准中对此没有任何保证。您可以继续使用这个工具链来推测您今天在系统上看到此输出的原因,但结果可能会变为任何(例如您的程序移动草坪或窃取皇冠上的珠宝) 任何原因。
实际上,没有办法安全地使用gets
。这就是它在当前C ++和C标准中被删除的原因。
您可以改为使用std::string
和std::getline
:
string buffer;
std::getline(std::cin, buffer);