如果初始数组值小于输入值,代码可以 运行 吗?

Can a code run if initial array value is less then input value?

执行以下C++代码后,我很困惑:

#include <iostream>
using namespace std;

int main()
{
    char name[0];
    int roll;
    cout << "Enter your name: ";
    cin.get(name, 30);
    cout << "Enter roll no.: ";
    cin >> roll;
    cout << "You have entered:" << '\n';
    cout << "Name: " << name << '\n' << "Roll No. " << roll << '\n';
    return 0;
}

如您所见,它只是接受输入并打印出来。但问题是,如果数组的值为0,cin应该如何读取我输入的所有字符!!!

输出结果如下:

Enter your name: Bharat Singh Chauhan
Enter roll no.: 12345
You have entered:
Name: Bharat Singh Chauhan
Roll No. 12345

抱歉,如果之前问过这个问题 ;)

此代码:

char name[0];
cin.get(name, 30);

调用未定义的行为,因为 name 没有足够的 space 来存储 30 个字符。这意味着任何事情都可能发生,包括程序有时似乎可以正常工作。

相反,您可以这样做:

std::string name;
std::cin >> name;
// or
std::getline(std::cin, name); // if you want to accept whitespace

这通常比使用数组更不容易出错。

char name[0]; - 这是零 0 个字符的数组。如果你读入超过 0 个字符,你有 undefined behaviour. Arrays don't automatically grow as you add stuff to them. For that you want std::vector or std::string.

因为C/C++ 本身不检查内存边界。它是 undefined behavior,因为您正在覆盖未在此处分配的内存,因此,可能会覆盖为其他目的分配的内存,其他变量、结构等。在其他条件下,您可以获得segmentation failed 错误。

为什么 segmentation failed 的条件现在没有满足?因为默认堆栈大小(您的变量被“分配”的内存)在默认情况下要大得多,并且可以轻松地在这里处理您的 hand-types 字符串。

编译器也可以有选项stack protection。因此,如果您超出堆栈内存,他们会发出警告。它不会真正保护您免受未定义行为或覆盖局部变量的影响,但可以帮助您找到问题,但并非总是如此,但当您的超限大到足以检测到它时。有关详细信息,请参阅此 link:Stack smashing detected