C语言中strcat函数导致无关字符串被覆盖的具体过程咨询
栈上缓冲区溢出导致strcat覆盖无关变量的具体过程
核心前提
- 局部数组变量(比如你代码里的
seg1、seg2、seg3)会被分配在栈内存中,且通常地址连续。栈的生长方向一般是从高地址向低地址,所以先声明的变量地址更高,后声明的变量地址更低。 - 用
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执行时:
- 找到
seg2末尾的\0(位于seg2的第9字节); - 先把
seg3的第一个字符'q'写到这个位置(覆盖原\0,这一步还在seg2的内存范围内); - 接下来的
'r'、's'、't'、'u'、'v'、'w'、'x',以及最后一个\0,会依次写入到seg2内存之外的区域——而这个区域正好是seg1的内存地址(因为栈上变量连续,seg1地址比seg2高,紧邻seg2的内存末尾); seg1原本的内容是"abcdefgh\0",被覆盖后,前7个字节变成'r'到'x',第8字节是\0,再加上原本seg1末尾的\0,最终就变成了你看到的"rstuvwx\0\0"。
本质上这是未检查缓冲区大小导致的栈溢出,strcat不会验证目标缓冲区是否有足够空间,直接越界写入破坏了相邻变量的数据。
内容的提问来源于stack exchange,提问作者goon
相关产品推荐
相关产品推荐

