测试输入缓冲区溢出

1 c++

例如,如果我输入大于10的字符,为什么不抛出异常或错误?你会得到getline的输入吗?

int main()
{
    char c[10];

    while (cin >> c)
    {
        cout << c << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 6

为什么不抛出异常或错误?

缓冲区溢出是未定义行为的示例.行为实际上是未定义的:如果溢出缓冲区,则无法保证程序将执行的操作.这不会产生异常,因为即使在正确的代码中这样做也需要大量相对昂贵的检查,而在C++中,一般的理念是你不需要支付你不需要的东西.

如果您避免使用原始数组和原始(非智能)指针并使用C++标准库容器,字符串和算法,则可以轻松避免大多数情况导致缓冲区溢出.

你会得到输入getline吗?

您可以使用std::getline,它允许您将字符的"行"提取到a中std::string,或者您可以直接使用>>和提取到std::string对象中,具体取决于您要提取的内容.