提问者:小点点

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


下面的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

如果问题是之前问的,对不起;)


共3个答案

匿名用户

此代码:

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。