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

使用C++的strcat()函数时第二个char数组输出缺失首字母的原因

问题原因分析

核心问题:缓冲区溢出(Buffer Overflow)

你的代码中使用strcat(s1, s2)时,目标数组s1的空间不足以容纳拼接后的字符串,导致缓冲区溢出,进而破坏了相邻的s2数组内容。

具体细节:

  1. 数组空间分配:

    • char s1[4] = "one";:"one"包含3个字符,加上字符串结束符'\0',刚好占满4个字节的数组空间,没有多余空间容纳其他字符。
    • char s2[4] = "two";:同理,"two"加'\0'也完全占满4个字节的数组空间。
  2. strcat的工作机制:
    strcat会将源字符串(s2)的内容追加到目标字符串(s1)的末尾,直到读取到源字符串的'\0',并在拼接后的整体末尾添加新的'\0'。拼接后的字符串"onetwo"需要的空间是:3(one)+3(two)+1(结束符)=7个字节,但s1仅分配了4个字节,空间严重不足。

  3. 溢出对s2的破坏:
    局部变量在栈内存中通常是连续分配的,s2的内存区域紧邻s1的末尾。当strcat超出s1的边界写入数据时,会直接覆盖s2的起始部分:

    • s1原有的结束符'\0'被s2的第一个字符't'覆盖;
    • 接着写入s2的第二个字符'w'到s1边界外的第一个位置(即s2的第一个字节);
    • 再写入s2的第三个字符'o'到s2的第二个字节;
    • 最后写入新的结束符'\0'到s2的第三个字节。
      这导致s2的内容被修改为{'w', 'o', '\0', ...},因此输出时只会显示"wo"。

解决方案:

  • 为s1分配足够容纳拼接后字符串的空间,例如声明为char s1[8] = "one";(8个字节足够存放7个字符加结束符);
  • 优先使用C++的std::string替代C风格字符数组,它会自动管理内存,从根源避免缓冲区溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:22:34