调用strcat拼接C风格字符串触发段错误的原因是什么
段错误根本原因
段错误完全由strcat(word1, word2)的非法调用触发,核心问题有两个:
strcat函数的工作逻辑是找到第一个参数指向字符串的末尾\0位置,把第二个参数的完整字符串(含末尾结束符)逐字节拷贝到这个位置之后,它要求第一个参数指向的内存空间必须有足够的剩余容量承载追加的内容。你的代码中char word1[] = "hello";定义的是栈上固定长度的字符数组,实际分配的大小只有6字节:5个'h'/'e'/'l'/'l'/'o'字符 + 1个自动添加的字符串结束符\0,没有任何多余空间存放要追加的长度为4的"haha"以及新的结束符。- 执行
strcat时会发生栈内存越界写入:word1数组紧邻的栈内存先后存放着word2数组、main函数栈帧的保存寄存器值、栈保护校验值、函数返回地址等数据,越界写首先会破坏这些栈上数据,当写入地址触碰到进程无权限访问的内存区域时,就会直接触发segmentation fault。即便没有立刻触发段错误,这种越界写也属于标准定义的未定义行为,运行结果完全不可预期。
正确实现参考
你完全不需要借助word1做中转拼接,直接操作动态分配的ptr数组即可,参考代码:
#include <cstring> #include <iostream> using namespace std; int main() { const char* word1 = "hello"; const char* word2 = "haha"; // 分配空间要算上两个字符串长度 + 1个结束符 const size_t total_len = strlen(word1) + strlen(word2) + 1; char* ptr = new char[total_len]; strcpy(ptr, word1); strcat(ptr, word2); cout << ptr << endl; // 记得释放动态分配的内存,避免泄漏 delete[] ptr; return 0; }
内容的提问来源于stack exchange,提问作者Eric Yan
相关产品推荐
相关产品推荐

