cout 打印的字符 [] 包含的字符数超过设置长度
cout prints char[] containing more characters than set length?
#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操作系统:Windows 10<</p>
它被称为缓冲区溢出,是代码错误和漏洞利用的常见来源。开发人员有责任确保它不会发生。字符串将被打印,直到它们到达第一个"\0"字符
代码产生"未定义的行为"。这意味着,任何事情都可能发生。在您的情况下,该程序意外运行。但是,它可能会使用不同的编译器标志或在不同的系统上执行完全不同的操作。
这不应该给出错误或其他东西吗?
不。编译器无法知道您将输入长字符串,因此不会出现任何编译器错误。您也不会在此处引发任何运行时异常。由您来确保程序可以处理长字符串。
您的代码遇到了 UB,也称为未定义行为,正如维基百科所定义的那样,这是执行计算机代码的结果,其行为不是由代码所遵循的语言规范规定的。 它通常发生在您注意正确定义变量时,在这种情况下是太小的字符数组。
甚至 -Wall 标志也不会给出任何警告。因此,您可以使用 valgrind 和 gdb 等工具来检测内存泄漏和缓冲区溢出。
你可以检查这些问题:
数组索引在 C 中越界
无越界错误
他们有称职的答案。
我的简短回答,基于我发布的问题中已经给出的问题:
- 您的代码实现了未定义的行为(缓冲区溢出(,因此当您运行一次它时不会给出错误。但其他一些时间它可能会给。这是一件偶然的事情。
- 当你输入一个更长的字符串时,你实际上破坏了程序的内存(堆栈((即你用你的数据覆盖了应该包含一些与程序相关的数据的内存(,所以你的程序的返回代码最终与0不同,这被解释为错误。绳子越长,把事情搞砸的机会就越高(有时甚至是短弦把事情搞砸了(
您可以在此处阅读更多内容:https://en.wikipedia.org/wiki/Buffer_overflow
相关文章:
- 提升区域设置规范化带状字符,但不规范化重音
- 将十六进制值设置为用于填充的字符变量时出现问题
- 注册表正在设置 1 个字符
- 是否有任何区域设置会影响宽字符编码?
- 我如何处理有关输入的字符串大小超过字符数组设置大小的错误?
- 以字符为单位设置控制台大小
- 将终端设置为原始模式:仅在按下下一个键后显示字符
- 将字符数组设置为彼此相等的方法不起作用
- 在无符号字符数组中设置无符号短字符
- 通过比较字符设置字符串时出现问题
- 无法使用 Unicode 特殊字符设置窗口文本
- 使用无符号字符设置文本格式
- 有没有办法为 TAB 字符(反斜杠 t)"t"设置特定数量的最大空格数C++?
- 如何将单个字符转换为为基本密码哈希器设置整数,C++
- 是否将常量字符*设置为等于字符[]文字安全
- 如何将字符设置为函数?我对语法感到困惑...设置<char>max_freq(映射<字符,整数>频率)
- 我如何将特定字符设置为多维数组中的不同颜色
- 将等于369的字符设置为与113相同的二进制图案是UB行为
- 提升shared_array<char>并从字符* 设置它
- C++程序检查 IBAN 帐号 - 如何为每个字符设置值:A=>10、B=>11、C=>12