下面的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
没有足够的空间存储30个字符。 这意味着任何事情都可能发生,包括程序有时看起来工作。
相反,您可以执行以下操作:
std::string name;
std::cin >> name;
// or
std::getline(std::cin, name); // if you want to accept whitespace
这通常比使用数组更不容易出错。
因为C/C++不检查内存边界。 这是未定义的行为
,因为您正在覆盖没有在这里分配的内存,所以,很可能,覆盖内存,是为另一个目的分配的,用于另一个变量,结构等。如果使用另一种条件,您可能会得到分段失败
错误。
为什么现在不满足分段失败
的条件? 因为默认堆栈大小(变量被“分配”的内存)在默认情况下要大得多,并且可以很容易地在这里处理手动类型字符串。
编译器还可以有选项堆栈保护
。 因此,如果您溢出堆栈内存,它们将发出警告。 它不会真正保护您免受未定义的行为或覆盖您的局部变量,但可以帮助发现问题,不总是,但当您的溢出足够大,可以检测到它时。 有关详细信息,请参阅此链接:检测到堆栈崩溃
char name[0];
-由零个0
字符组成的数组。 如果向其中读取的字符超过0
,则为未定义的行为。 数组不会在添加内容时自动增长。 为此,您需要STD::Vector或STD::String。