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

C语言strcpy复制第3个字符串到结构体时触发EXC_BAD_INSTRUCTION错误

问题根因

报错的核心原因是第三个地点字符串里的长破折号–(注意这不是ASCII编码的普通短横-),它是UTF-8编码的多字节字符,单个字符占3个字节空间。
你自定义的string类型是长度为51的char数组,C语言规定字符串末尾必须存储一个\0作为终止标记,因此这个数组最多只能存放占50字节的内容。你之前测试时替换成相同可见字符数的普通ASCII字符串时,所有字符都只占1字节,算上终止符总长度刚好不超限,所以不会报错;但带长破折号的原字符串,因为这个特殊符号多占了2字节,算上终止符总长度超过了51字节,执行strcpy时发生缓冲区溢出,写坏了栈内存里的关键数据(比如函数返回地址),最终触发EXC_BAD_INSTRUCTION硬件异常。

修复方案
  • 直接把字符串里的长破折号替换成普通ASCII短横-,字符串总长度就会降到限制范围内,不需要改其他代码。
  • 如果必须保留原长破折号写法,就把string的定义长度调大,比如改成typedef char string[60];,预留足够空间存放多字节字符和末尾的终止符。
  • 注意:C语言用char数组存字符串时,非ASCII的特殊符号、中文等内容都是多字节存储,一个肉眼可见的字符可能占2-4字节,计算占用空间时不能只数可见字符数量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 11:30:45