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 char
s,您需要为空终止符留出空间。
如果程序没有做任何事情来限制输入那个变量的数据量,为什么在我写了一定长度的Hellooooooo之后它就停止了?
@churill “正在做”,即尚未完成
【参考方案1】:
[触发警告:车祸、截肢、猫]
如果我写了超过 5 个字符,程序不应该允许它,但它确实允许。
这是夸大其词。
语言不允许这样做,但编译器和运行时不会强制执行。那是因为它会从性能中扣除一直执行边界检查以寻找程序员错误,惩罚那些没有犯任何错误的人。
所以,你违反了合同,接下来发生的事情是不确定的。假设您编写了正确的程序,您可能会在编译器中遇到一些“优化”;你可以在运行时覆盖一些内存,导致崩溃;你可以在运行时覆盖一些内存,得到一个明显“有效”的字符串,直到下一个碰巧在那里的 NULL;或者,你可以打开一个虫洞到当地的猫舍。你只是不知道。
这称为未定义的行为。
类比是超速行驶。你的车不会阻止你超速,但法律规定不能,如果你仍然这样做,你可能会被捕,或者撞到人,或者失去控制,然后撞到一棵树上,失去你所有的四肢。一般来说,最好不要冒险。
【讨论】:
非常感谢您的回答,现在我明白了。另外,当我阅读您的评论时,我刚刚意识到我刚刚写的内容是数组的结构,对吗? -> char 任何东西 [5] ;那里会有 0 1 2 3 4 个数组元素,每个元素的值为 0。所以如果我想显示一个,我可以做任何事情 [2],但为什么它允许我在屏幕上显示为 'cout @LuigiIstratescuanything
是char
的五元素数组,是的
好的 nvm,如果我构建并运行,我什么都做不了,程序崩溃了,如果我只运行,我可以做我上面写的。
@LuigiIstratescu 我没有关注你,对不起,你一直在改变你的评论,所以我很难跟上。祝你好运!以上是关于Char 变量超出限制的主要内容,如果未能解决你的问题,请参考以下文章