cin.get(name,30)调整字符名称大小[10]

cin.get(name,30) resize char name [10]?

本文关键字:字符 调整 get name cin      更新时间:2023-10-16

我写了这段代码,但我不明白如果你的大小仍然是10?,为什么char[]允许我存储超过10个字符?。通常是什么函数cin.get()启用的?

#include <iostream>
using namespace std;
int main(){
char name[10];
cout<<"enter name: ";
cin.get(name,30);
cout<<"char[]: "<<name<<endl;
cout<<"size: "<<sizeof name;
return 0;
}

简单地说,因为它是C++。该语言的设计反映了其早期的硬件,其中几个字节的内存是宝贵的(这在一些专业环境中仍然非常有用,例如嵌入式硬件)。为了最大限度地控制内存管理,作为程序员,您有很多关于内存分配(和释放!)的地方和时间的话要说,这意味着您还必须自己做一些相关的记账。

在这种情况下,如果您保留了10个字符的内存,然后告诉另一个函数它可以写30个字节,它将相信您传入的变量已经准备好了。这确实意味着你在没有分配给你的内存中写作,这可能会(读作:在你最意想不到的时刻会)产生恶劣的副作用,比如微妙地改变变量值,或者只是简单地破坏你的程序。

cin.get这样的函数接受缓冲区大小的原因是,您需要告诉它们可以使用多少内存,而这永远不应该超过您分配的内存。如果你想避免这种情况,你可以使用像std::string这样的类,它们试图把这种低级的东西从你的手中拿走。

这是未定义的行为。C++标准并没有定义如果你这样做会发生什么。

来自C++14标准草案N4296,§1.3.24:

允许的未定义行为包括忽略情况完全不可预测的结果,到翻译过程中的行为或以环境特征的文件化方式执行程序(无论是否发布诊断消息)、终止翻译或执行(带有诊断消息的发布)。


你可能会比标准低一个级别,即操作系统,除了其他东西之外,它还负责内存管理
缓冲区name分配在堆栈上,紧挨着堆栈帧自动变量线程局部变量
当调用cin.get(name, 30)时,数据可能会被写入数组的边界,从而有效地覆盖我枚举的数据。甚至可能发生调用试图写入堆栈边界的情况,这几乎肯定会被操作系统捕获。