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

C语言中strcat函数导致无关字符串被覆盖的具体过程咨询

栈上缓冲区溢出导致strcat覆盖无关变量的具体过程

核心前提

  1. 局部数组变量(比如你代码里的seg1、seg2、seg3)会被分配在栈内存中,且通常地址连续。栈的生长方向一般是从高地址向低地址,所以先声明的变量地址更高,后声明的变量地址更低。
  2. 用char arr[] = "字符串";定义数组时,数组大小会自动包含字符串末尾的隐含终止符\0。所以你的三个数组每个都是9字节(8个可见字符 + 1个\0)。

strcat的工作逻辑

strcat(dest, src)的执行步骤是:

  • 遍历dest,找到它的终止符\0的位置;
  • 从这个位置开始,把src的所有字符(包括src末尾的\0)逐个拷贝到dest的后续地址中。

溢出覆盖的具体过程

你的代码里seg2本身已经占满9字节(存着"ijklmnop\0"),没有多余空间容纳seg3的内容("qrstuvwx\0",共9字节)。当strcat执行时:

  1. 找到seg2末尾的\0(位于seg2的第9字节);
  2. 先把seg3的第一个字符'q'写到这个位置(覆盖原\0,这一步还在seg2的内存范围内);
  3. 接下来的'r'、's'、't'、'u'、'v'、'w'、'x',以及最后一个\0,会依次写入到seg2内存之外的区域——而这个区域正好是seg1的内存地址(因为栈上变量连续,seg1地址比seg2高,紧邻seg2的内存末尾);
  4. seg1原本的内容是"abcdefgh\0",被覆盖后,前7个字节变成'r'到'x',第8字节是\0,再加上原本seg1末尾的\0,最终就变成了你看到的"rstuvwx\0\0"。

本质上这是未检查缓冲区大小导致的栈溢出,strcat不会验证目标缓冲区是否有足够空间,直接越界写入破坏了相邻变量的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:55:34