C语言strcpy函数行为异常:原数组被修改、越界复制成功?
strcpy越界导致的内存异常解析
为什么name数组会被修改?
strcpy的工作逻辑是从源字符串起始地址逐个复制字节,直到遇到'\0'为止,完全不检查目标数组的容量。- 你代码里的
"The Batman"包含结束符'\0'一共是11个字节(不是注释里的10个),而name2只有5个字节的存储空间。执行strcpy时,会把11个字节全部往name2写入,必然超出name2的内存边界,写到相邻的内存区域。 - C语言中局部变量通常在栈上连续分配(具体顺序由编译器决定),如果
name2的内存地址刚好和name相邻,越界写入的字节就会直接覆盖name的内容。你看到name变成"atman",就是因为name的前几个字节被越界数据覆盖了。
为什么name2容量不足却看似“成功”完成赋值?
- 这不是真正的成功,而是未定义行为的一种表现。
strcpy没有边界校验机制,它不会判断目标数组能否容纳源字符串,只要内存可访问就会持续复制。 - 这种越界写入极度危险:轻则破坏其他变量的内存(比如你的
name被修改),重则覆盖栈帧关键数据导致程序崩溃,甚至引发安全漏洞。
内容的提问来源于stack exchange,提问作者Sudipta Sarker
相关产品推荐
相关产品推荐

