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

字符串数组输入超出容量时的输出结果及原因分析

输入超长内容时程序的输出及原因

先看你提供的代码:

#include <stdio.h>

int main() {    
    char str[2];
    printf("Enter anything ");
    scanf("%s", str);
    printf("%s", str);
}

当输入内容长度大于数组str的容量时,没有固定的输出结果,大概率会出现以下两种情况之一:

  1. 完整输出你输入的内容
  2. 程序直接崩溃,或者出现其他诡异的运行错误

背后的原因是缓冲区溢出导致的未定义行为:

  • char str[2]只申请了2字节的栈内存,C语言字符串需要以\0结尾,所以这个数组最多只能存1个有效字符加结束符。
  • scanf("%s", str)不会检查目标数组的大小,它会读取所有输入的非空白字符,把超出数组容量的字符直接写到str后面的栈内存区域里,破坏了原本存储在那里的数据。
  • 如果溢出的内容没有覆盖到程序运行的关键数据(比如函数返回地址),printf("%s", str)会顺着内存一直读取,直到碰到某个随机存在的\0,这时你可能会看到完整的输入内容;但如果溢出覆盖了关键数据,程序会立即崩溃,或者出现逻辑混乱的错误。

这种行为完全不可靠,属于严重的代码漏洞,实际开发中绝对不能这么写,必须限制scanf的读取长度(比如用scanf("%1s", str)),或者使用更安全的输入函数。

内容的提问来源于stack exchange,提问作者Shamil Roshan.N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:32:33