You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:17:41