如果初始数组值小于输入值,代码可以 运行 吗?
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
执行以下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