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

数组大小改变为何影响scanf输出?输入10 5时的异常分析

问题分析与解答

核心原因:字符串终止符导致的数组越界

C语言中,scanf("%s")读取字符串时,会自动在末尾添加**空终止符'\0'**标记字符串结束,这是问题的关键:

  • 当定义char k[1]时,数组仅能容纳1个字符,但输入的"5"加上终止符'\0'需要2个字节的存储空间。scanf会强行将'\0'写入k数组的边界之外,这属于未定义行为(内存越界访问)。
  • 栈上变量通常是连续布局的,k数组紧邻n数组内存区域,越界写入的'\0'会覆盖n数组的起始位置或关键节点,导致strlen(n)计算出的字符串长度为0,因此循环for (int i = 0; i < strlen(n); i++)完全不执行,最终只输出k对应的5。
  • 当定义char k[2]时,数组有足够空间容纳'5'和'\0',不会发生越界。n数组的内存未被破坏,strlen(n)能正确得到长度2,循环输出10,再输出5,结果符合预期。

代码中的其他问题

  1. 数组大小定义错误:char n[10 ^ 1000];中的^是按位异或运算符,不是幂运算。10异或1000的结果是1022,数组实际大小为1022字节。若想定义超长字符串数组,栈空间无法满足(通常仅几MB),且C语言要求数组大小为编译期常量,10的1000次方远超范围。建议根据实际需求定义合理大小,比如char n[1001];(可容纳1000个字符加终止符),或用malloc动态分配内存。
  2. 缓冲区溢出风险:scanf("%s")未限制输入长度,若输入字符串超过数组大小,会再次触发内存越界。建议使用格式限定符,比如scanf("%1000s", n),避免溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:27:16