c++ - 为什么 std::adressof() 在无效输入时表现如此?

标签 c++ pointers

假设我有以下代码:

int main(int argc, char *argv[])
{
    int input;
    cin >> input;
    cout << std::addressof(input) << endl;
    main(argc, argv);
}

如果你给它一个有效的 int 输入,它只会打印一个普通的地址,但是,如果你给它一个无效的值(即“这是一个字符串值”,“kasdkjadlksnkqlw~”或 9999999999999999999)它会继续打印地址.

为什么会这样?这是所谓的缓冲区溢出吗? 额外:如何在此网站上启用语法高亮显示?

最佳答案

让我们调用函数 meow(或将其放入命名空间),因为使用 ::main 会使程序格式错误。

int meow(int argc, char *argv[])
{
    int input;
    cin >> input;
    cout << std::addressof(input) << endl;
    meow(argc, argv);
    return 0;
}

失败的流提取会在流上设置 failbit。以后对该流的提取操作将立即失败,而不会阻塞输入,因此您最终会一遍又一遍地陷入(明显的)无限递归打印地址。

(您的代码无论如何都具有无限递归;唯一的区别是当 cin >> input block 时它不那么明显。)

关于c++ - 为什么 std::adressof() 在无效输入时表现如此?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36901616/

相关文章:

C++ 为错误使用自定义打印/日志功能添加编译器警告

c++ - 在堆中定义不同大小的结构

C++ 转换运算符

c++ - 在 GLM (OpenGL) 中将矩阵和 vector 相乘

integer - 将整数与指针相加

复制双指针字符串

c++ - 指针的两种不同类型的星号位置?

c - 修改在 C 中作为指针传递的结构

c++ - 使用线程本地存储将具有全局变量的单线程遗留代码转换为多线程代码

c++ - char 数组作为 placement new 的存储