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

C语言strcpy函数问题:目标仅能存1字符为何可打印完整字符串

strcpy越界写入后仍可正常输出完整字符串的原因

首先这是C语言未定义行为的典型表现,出现该现象的具体逻辑如下:

  • C标准库中的strcpy函数没有内置缓冲区边界校验能力,它只会从源字符串的起始地址开始逐字节复制,直到遇到末尾的\0结束符才停止,完全不会感知目标缓冲区的可容纳长度上限。只要源字符串长度超过目标缓冲区的声明大小,就会触发缓冲区溢出,属于标准明确规定的未定义行为范畴,程序出现任何运行结果(包括看似正常输出、崩溃、乱码等)都符合规则。
  • 本次运行可以正常输出完整字符串属于巧合:
    1. 栈内存分配时编译器通常会做内存对齐处理,你声明的仅能容纳1个字符的缓冲区,实际在栈上分配时后面会附带几字节的未被其他逻辑占用的对齐预留空间,越界写入的"Hello\0"刚好全部存在了这段未被占用的连续内存中,没有覆盖栈上的函数返回地址、栈帧基址等关键数据,所以程序没有直接崩溃。
    2. printf打印字符串时仅以\0作为结束标志,不会校验字符串所属缓冲区的声明长度,它从目标缓冲区的首地址开始逐字节读取,直到读到末尾的\0就停止,自然会输出完整的"Hello",连续打印两次自然就会得到两行相同的完整输出。

注意:该现象完全依赖当前运行环境的栈布局、编译器优化参数,没有任何可移植性。如果切换编译环境、调整代码变量定义顺序,大概率会出现乱码、程序崩溃甚至恶意代码执行的安全问题。生产环境必须使用strncpy、snprintf等带长度校验的安全字符串操作函数替代strcpy。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:06:03