Char 变量超出限制

Posted

技术标签:

【中文标题】Char 变量超出限制【英文标题】:Char variable goes Over the limit 【发布时间】:2020-12-06 15:46:59 【问题描述】:

我正在上 C++ 的强化课程,我是那种喜欢并想了解阳光下所有事物的人,否则我无法继续我的家庭作业。

char anything[5];
cin >> anything;
cout << anything << endl;

我可以在控制台中写“Hello”,一切都很好。写“H”也不错,“Hel”也不错。但是不应该是写“Helloo”或“Hellooo”,它有效!我写“Hellooooooooooooooooooooooooooooooooo”程序崩溃的那一刻,没关系。使用数字时也是如此。

为什么会这样?我正在使用 CodeLite。

据我了解,如果我写了超过 5 个字符,程序不应该允许它,但它确实允许。

这背后的解释是什么?

【问题讨论】:

程序不应该允许它 你为什么这么认为?您的程序不会限制输入该变量的数据量。这样做是你的。 如果它没有教你未定义的行为,那么“C++ 强化课程”可能不会那么好。也许你想要一个 good C++ book 代替? 另请注意:Hello 是 5 chars,您需要为空终止符留出空间。 如果程序没有做任何事情来限制输入那个变量的数据量,为什么在我写了一定长度的Hellooooooo之后它就停止了? @churill “正在做”,即尚未完成 【参考方案1】:

[触发警告:车祸、截肢、猫]


如果我写了超过 5 个字符,程序不应该允许它,但它确实允许。

这是夸大其词。

语言不允许这样做,但编译器和运行时不会强制执行。那是因为它会从性能中扣除一直执行边界检查以寻找程序员错误,惩罚那些没有犯任何错误的人。

所以,你违反了合同,接下来发生的事情是不确定的。假设您编写了正确的程序,您可能会在编译器中遇到一些“优化”;你可以在运行时覆盖一些内存,导致崩溃;你可以在运行时覆盖一些内存,得到一个明显“有效”的字符串,直到下一个碰巧在那里的 NULL;或者,你可以打开一个虫洞到当地的猫舍。你只是不知道。

这称为未定义的行为

类比是超速行驶。你的车不会阻止你超速,但法律规定不能,如果你仍然这样做,你可能会被捕,或者撞到人,或者失去控制,然后撞到一棵树上,失去你所有的四肢。一般来说,最好不要冒险。

【讨论】:

非常感谢您的回答,现在我明白了。另外,当我阅读您的评论时,我刚刚意识到我刚刚写的内容是数组的结构,对吗? -> char 任何东西 [5] ;那里会有 0 1 2 3 4 个数组元素,每个元素的值为 0。所以如果我想显示一个,我可以做任何事情 [2],但为什么它允许我在屏幕上显示为 'cout @LuigiIstratescu anythingchar 的五元素数组,是的 好的 nvm,如果我构建并运行,我什么都做不了,程序崩溃了,如果我只运行,我可以做我上面写的。 @LuigiIstratescu 我没有关注你,对不起,你一直在改变你的评论,所以我很难跟上。祝你好运!

以上是关于Char 变量超出限制的主要内容,如果未能解决你的问题,请参考以下文章

超出 Appengine 数据存储区读取操作限制

分配对局部变量的引用,如果局部变量超出范围,它会超出范围吗?

当变量超出范围时会发生啥?

环境变量PATH超长问题[转]

BEx Query Designer中的变量及其增强

Python ARIMA 外生变量超出样本