You need to enable JavaScript to run this app. C语言自定义字符串拼接函数调用后s1打印异常的原因分析
优惠活动
大模型
产品
解决方案
定价
更多

C语言自定义字符串拼接函数调用后s1打印异常的原因分析

异常根因拆解

核心问题定位

  • 函数参数语义与实现逻辑完全错位
    你写的my_strconcat内部逻辑本质是标准字符串拼接的实现:找到第二个入参的字符串末尾,把第一个入参的内容逐字节拷贝到该位置,最后补字符串结束符。但形参命名完全反了,给两个入参标注的src、dest顺序和实际逻辑相反,实际调用时传入my_strconcat(s1, s6),等价于执行「把s1的内容拼接到s6的尾部」,和你预期的「把s6拼接到s1尾部」完全相反。
  • 目标缓冲区空间不足,触发栈内存越界覆写
    定义的s6数组仅能存储"How"3个字符加1个结束符,总空间4字节,没有任何多余余量用来写入拼接内容。
    栈上局部变量按定义顺序从高地址到低地址紧邻排布,s6数组的内存后方直接相邻s1数组的首地址。当程序往s6的尾部写入拼接内容时,越界写入的字节直接覆盖了s1的内存:
    1. 指针移动到s6的结束符位置后,开始逐字节拷贝s1的内容
    2. 前几次写入落在s6自身的内存范围内,让s6的内容变成"How"加s1的首字符'H'
    3. 后续写入越过s6的内存边界,直接把s1首地址位置原本存储的'H'覆盖为s1的第二个字符'e'
      这就是最终输出里s1丢失首字符、s6被追加全部s1内容的直接原因——本质是越界写踩中了相邻栈变量的内存。

修正方案

  1. 对齐函数形参与标准拼接逻辑的语义顺序:
    // 第一个入参为拼接目标缓冲区,第二个入参为待拼接的源串,源串加const标记避免意外修改
    void my_strconcat(char *dest, const char *src)
    {    
        // 移动dest指针到自身字符串的末尾位置
        while(*dest)
            dest++;
        // 逐字节拷贝src内容到dest的尾部
        while(*src) {
            *dest++ = *src++;
        }
        *dest = '\0';
    }
    
  2. 给作为拼接目标的缓冲区预留足够空间,避免越界:
    // 不按字符串长度固定s1的数组大小,预留充足的拼接余量
    char s1[100] = "HelloGoodMorningEveryone1";
    char s6[] = "How";
    
  3. 调用时匹配函数语义,将目标缓冲区s1作为第一个入参、源串s6作为第二个入参传入,即可实现预期的拼接效果。

内容的提问来源于stack exchange,提问作者Devi Prasad Damarasingu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 06:54:03