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
相关产品推荐
相关产品推荐

