C语言调用strcat拼接字符串触发zsh: illegal hardware instruction错误原因
代码错误原因
strcat函数要求第一个入参(目标字符串)的内存空间必须足够容纳拼接后的完整字符串(包括末尾的\0结束符),该函数不会自动为目标字符串申请额外内存。- 你的代码中
char str1[] = "sandeep";是根据字符串字面量长度自动分配内存,"sandeep"共7个可见字符,加末尾隐藏的\0结束符,str1实际仅分配了8字节的内存空间。 - 拼接
str2的sahani(共7字节,含\0)时,需要的总存储空间为 7(str1可见字符)+6(str2可见字符)+1(结束符)=14字节,远大于str1的8字节容量,触发栈缓冲区溢出。 - 溢出的内容会覆盖栈上保存的函数返回地址等关键数据,程序执行到main函数返回阶段时,CPU会尝试跳转到被篡改的非法地址执行指令,最终抛出
illegal hardware instruction错误。
修复方法
手动给目标字符串str1分配足够大的内存空间即可,修改后的参考代码如下:
#include <stdio.h> #include <string.h> int main() { // 手动指定数组长度,需保证长度 ≥ 原字符串长度 + 待拼接字符串长度 + 1(结束符占位) char str1[20] = "sandeep"; char str2[] = "sahani"; strcat(str1, str2); printf("%s %s", str1, str2); return 0; }
内容的提问来源于stack exchange,提问作者Sandeep Sahani
相关产品推荐
相关产品推荐

