You need to enable JavaScript to run this app. C语言练习使用strcpy()时出现stack smashing错误是什么原因?
优惠活动
大模型
产品
解决方案
定价
更多

C语言练习使用strcpy()时出现stack smashing错误是什么原因?

报错原因分析

触发stack smashing(栈粉碎)的核心原因是代码存在缓冲区越界写入,具体问题点如下:

  • 首先,sprintf的写入逻辑存在隐式越界
    sprintf使用%d格式化数字为字符串时,无论数字位数多少,都会自动在末尾追加\0字符串结束符。你定义的str数组长度仅为4,当循环执行到i=3时,sprintf(&str[3],"%d", array[i])会先把数字5转为字符'5'写入str[3],随后追加的\0会直接写入str数组的边界之外,已经属于非法栈内存写入。
  • 其次,strcpy的拷贝规则直接触发栈保护检测
    strcpy的工作逻辑是:从源内存地址开始逐字节拷贝内容,直到遇到\0才会终止,且终止符\0也会被拷贝到目标地址。你的代码中str数组没有预留\0的存储位置,&str[i]对应的源字符串没有合法结束标记,strcpy会持续往temp数组之后的栈空间写入数据,直接破坏了栈上的栈保护标记(Canary),操作系统检测到栈结构被破坏后就会抛出stack smashing错误。

补充修复建议:如果你的需求只是拷贝单个字符,不需要调用strcpy,直接通过temp[i] = str[i]赋值即可;如果需要把str作为合法字符串使用,必须至少额外预留1个字节的空间存储\0结束符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 17:06:07