cout打印包含比设定长度更多的字符的char []? [重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cout打印包含比设定长度更多的字符的char []? [重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
#include<iostream>
using namespace std;
int main(void)
{
char name[5];
cout << "Name: ";
cin.getline(name, 20);
cout << name;
}
输出:
Name: HelloWorld
HelloWorld
这不应该给出错误或什么?
当我写一个更长的字符串时,
Name: HelloWorld Goodbye
HelloWorld Goodbye
cmd退出时出错。
这怎么可能?
编译器:G ++(GCC 7),Nuwen OS:Windows 10
答案
它被称为缓冲区溢出,是代码错误和漏洞利用的常见来源。开发人员有责任确保不会发生这种情况。字符串将被打印,直到它们到达第一个' 0'字符
另一答案
代码产生“未定义的行为”。这意味着,任何事情都可能发生在您的情况下,该程序意外地工作。但是,它可能会对不同的编译器标志或不同的系统执行完全不同的操作。
不应该给出错误或其他什么。
编号。编译器无法知道您将输入长字符串,因此不会出现任何编译器错误。您也不会在此处抛出任何运行时异常。由您来确保程序可以处理长字符串。
另一答案
您的代码遇到了UB,也称为未定义行为,正如维基百科所定义的那样,执行计算机代码的结果,其行为不是代码所遵循的语言规范所规定的。它通常发生在您正确记录定义变量时,在这种情况下是一个太小的char数组。
另一答案
连-Wall标志都不会发出任何警告。所以你可以使用像valgrind和gdb这样的工具来检测内存泄漏和缓冲区溢出
另一答案
你可以检查这些问题:
他们有合适的答案。
我的简短回答,基于我发布的问题中已经提到的那些:
- 您的代码实现了Undefined Behavior(缓冲区溢出),因此当您运行一次时它不会出错。但其他时间可能会给。这是一个偶然的事情。
- 当你输入一个更长的字符串时,你实际上破坏了程序的内存(堆栈)(即你覆盖了应该包含一些程序相关数据的内存,包含你的数据),所以你的程序的返回代码最终不同于0解释为错误。弦越长,把东西搞砸的可能性就越高(有时候即使是短弦也搞砸了)
你可以在这里阅读更多:https://en.wikipedia.org/wiki/Buffer_overflow
以上是关于cout打印包含比设定长度更多的字符的char []? [重复]的主要内容,如果未能解决你的问题,请参考以下文章