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

为何C语言中char[10]数组可容纳超过10个字符?

为什么长度为10的字符数组能容纳并输出超长字符串?

核心原因:缓冲区溢出+未定义行为

你用的gets()是个完全不做边界检查的危险函数——它根本不管name[10]的长度,会把输入的所有字符一股脑往数组里写,哪怕超出数组的内存范围。这种超出数组边界写入的操作就是缓冲区溢出,属于C语言里的未定义行为。

name[10]本身只能存9个有效字符(因为C语言字符串需要末尾的\0作为结束标记,占1个位置),但gets()会把超长输入的所有字符(包括最后的\0)写到数组后面的内存区域里,覆盖掉原本不属于这个数组的内存空间。

而printf("%s")的逻辑是从数组起始地址开始读,直到碰到\0才停止。因为gets()已经把整个输入的字符串(包括越界写的部分)都加上了\0,所以printf会顺着内存一直读,自然就输出了全部内容。

但这种行为完全不可靠:缓冲区溢出可能会破坏其他变量的值、导致程序崩溃,甚至被恶意代码利用,所以gets()早就被C11标准废弃了,绝对不能再用。

正确的替代方案

  • 用fgets()限制读取长度,它会自动处理\0,还能避免溢出:
    fgets(name, sizeof(name), stdin);
    
    这样最多读取9个字符(留1个位置给\0),超出的输入会留在输入缓冲区里。
  • 如果是Windows平台,也可以用C11引入的gets_s(),但它的移植性不如fgets()。

你的代码

#include<stdio.h>
int main(){
    char name[10]; // 长度为10的字符数组
    gets(name); // INPUT:  THIS IS BEAUTIFUL WORLD! 

    printf("Given string %s", name); // 按预期应仅输出前10个字符
    // OUTPUT : Given string THIS IS BEAUTIFUL WORLD! 
    return 0;
}

内容的提问来源于stack exchange,提问作者Danish Khatri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:45:42