cin.get(name,30)调整字符名称大小[10]
cin.get(name,30) resize char name [10]?
我写了这段代码,但我不明白如果你的大小仍然是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)
时,数据可能会被写入数组的边界,从而有效地覆盖我枚举的数据。甚至可能发生调用试图写入堆栈边界的情况,这几乎肯定会被操作系统捕获。
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为char数组调整zlib-zpipe
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 调整大小后指向元素值的指针unordered_map有效?
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 当您在此单词中搜索单词时调整字符数组的大小?
- 如何调整标准::字符串的大小以删除所有空终止符字符?
- 调整结构/字符数组的大小(以减少内存使用)
- C++有没有一种方法可以将向量调整为特定的字符
- 如何调整属于类的唯一指针的字符数组的大小.它必须在程序的整个生命周期中保持活力
- cin.get(name,30)调整字符名称大小[10]
- 调整字符数组的大小
- 调整字符数组大小并不总是有效