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

为何C++中strcpy()复制时,目标数组过小会修改源字符串?

为什么strcpy会在g2尺寸过小时修改g1?

首先明确strcpy的行为:它会从源字符串的起始位置开始逐字节复制,直到遇到字符串终止符\0才停止,完全不会检查目标缓冲区的可用空间大小。

当你把g2的尺寸改为7时,问题的核心是缓冲区溢出:g1中的字符串(包括终止符)长度远大于7,strcpy复制时会超出g2的内存边界,继续往后续的内存地址写数据。

而g1和g2都是全局变量,在多数编译器的内存布局中,全局变量会被分配到同一段连续的内存区域(比如.data段)。如果g2的内存地址恰好位于g1的前面,那么溢出的字节就会直接覆盖到g1的内存空间里,最终导致g1的内容被修改。

需要注意的是,这种情况属于C语言中的未定义行为——不是所有场景下都会出现g1被修改的结果,不同编译器、编译选项甚至不同运行环境下,全局变量的内存排布可能不同,溢出的内存也可能覆盖其他数据、触发程序崩溃,只是你遇到的场景刚好出现了g1被修改的现象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:42:33