C++中零长度数组使用cin.get为何仍能正常读取输入?
为什么长度为0的字符数组能被cin读取并输出?
这问题问得很有意思!本质上你碰到的是C++里典型的未定义行为(Undefined Behavior),咱们掰开揉碎了说:
首先看
char name[0];:C++标准其实是不允许定义长度为0的数组的,不过部分编译器(比如GCC)会把它当作扩展特性支持。但就算编译器允许,这个数组不占用任何内存空间——它的地址只是一个“空占位”的指针,指向的内存区域根本不属于你的程序,是非法访问范围。再看
cin.get(name, 30);的操作:这个函数的逻辑是把输入的字符往你传入的指针指向的内存里写,最多写29个字符加一个结束符'\0'。但你传入的name指向的是一块不属于你的内存,这时候函数还是会硬往这个地址后面写数据,属于非法的内存越界写入。为什么看起来“正常运行”?这就是未定义行为最坑的地方:它可能刚好“蒙混过关”——你写入的内存区域碰巧没有被程序里的其他重要数据占用,也没触发系统的内存保护机制(比如段错误)。但这完全是运气,换个编译器、换个操作系统,或者在程序里多定义几个变量,大概率会出现崩溃、数据乱码,甚至更诡异的程序异常。
正确的写法:要么定义足够大的数组(比如
char name[30];),更推荐的是用C++的std::string来处理字符串,既安全又省心:#include <iostream> #include <string> using namespace std; int main() { string name; int roll; cout << "Enter your name: "; getline(cin, name); cout << "Enter roll no.: "; cin >> roll; cout << "You have entered:" << '\n'; cout << "Name: " << name << '\n' << "Roll No. " << roll << '\n'; return 0; }
内容的提问来源于stack exchange,提问作者Bharat
相关产品推荐
相关产品推荐

