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

strcat未遇空终止符时输出重复‘First’的原因咨询

问题原因解析

首先明确核心问题:str2[6] = "Second" 没有给字符串终止符 \0 留空间,导致 strcat 越界读取栈内存。

1. 为什么 str2[6] 没有终止符?

"Second" 包含6个字符(S、e、c、o、n、d),你定义的 str2 大小刚好是6,这6个字节被字符完全占满,没有多余空间存储C字符串必需的 \0(空终止符)。而C标准库的字符串函数(比如 strcat、printf("%s"))都是靠 \0 判断字符串结束位置的。

2. 为什么会输出 FirstSecondFirst?

这是栈内存布局导致的巧合:

  • 局部变量在栈上的分配通常遵循先声明的变量地址更高(栈是向下生长的)。你先声明 str1[30],再声明 str2[6],所以 str2 的内存末尾之后,刚好就是 str1 的起始地址。
  • 执行 strcat 时,它先找到 str1 末尾的 \0(原 str1 中 "First" 后的终止符),开始复制 str2 的内容。复制完 str2 的6个字符后,因为找不到 \0,strcat 会继续读取 str2 后面的内存——也就是 str1 的起始位置,把 str1 里的 "First" 再次复制到 str1 的后续位置。
  • 直到读取到栈中某个天然存在的 \0(可能是栈内的垃圾值,刚好在第二次 "First" 之后),strcat 才停止。最终 str1 内的内容变成 First + Second + First,printf 输出到这个 \0,就出现了你看到的结果。

3. 为什么改 str2 为7就正常?

str2[7] 给 \0 预留了空间:"Second" 占6个字节,第7个字节会被自动填充为 \0,成为合法的C字符串。strcat 复制到 \0 就停止,只会把 "Second" 追加到 str1 后面,最终输出 FirstSecond。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:42:50