char*不能直接相加,因+是指针算术而非字符串连接;需先计算总长(+1给'\0'),再分配内存,最后用memcpy等复制并补'\0';推荐优先使用std::string。

用指针拼接字符串时,char* 不能直接相加
很多人写 str1 + str2 想把两个 C 风格字符串连起来,结果编译报错或运行崩溃。这是因为 char* 是地址,+ 是指针算术(比如 ptr + 1 跳过一个字符),不是字符串连接。真正要拼接,得手动分配内存、复制内容。
手动拼接需三步:算长度、申请空间、逐字拷贝
假设你有两个以 \0 结尾的 char* 字符串,比如 const char* a = "hello" 和 const char* b = "world",安全拼接的关键是别越界、别漏 \0:
- 先用
strlen(a)和strlen(b)算总长,记得 +1 给结尾的\0 - 用
new char[len]或malloc(len)分配新内存(注意后续要delete[]或free) - 用
strcpy拷贝第一段,再用strcat接第二段;或者用memcpy手动复制两段,最后设result[len-1] = '\0'
示例片段:
const char* a = "hello"; const char* b = "world"; size_t len_a = strlen(a), len_b = strlen(b); char* result = new char[len_a + len_b + 1]; memcpy(result, a, len_a); memcpy(result + len_a, b, len_b); result[len_a + len_b] = '\0'; // 必须补\0 // 使用完后:delete[] result;
用 std::string 指针反而增加复杂度
有人想用 std::string* 来“连接”,比如 new std::string(*s1 + *s2),这虽然能工作,但毫无必要——std::string 本身重载了 +,直接用对象更安全、更简洁。用指针只会引入空指针、内存泄漏、双重释放等风险:
立即学习“C++免费学习笔记(深入)”;
- 如果传入的是临时
std::string的地址(如&(std::string("a") + "b")),指针立刻悬空 - 自己
new std::string后又忘记delete,就是泄漏 - 函数接口若接收
std::string*,调用方必须确保生命周期足够长,极易出错
正确做法是传值或 const 引用:std::string concat(const std::string& a, const std::string& b) { return a + b; }
常见崩溃点:忘了分配足够空间或没写结束符
最常踩的坑是只申请了 strlen(a) + strlen(b) 字节,漏掉 +1,导致 result 没有 \0;或者拷贝时下标越界(比如写成 result[len_a + len_b + 1] = '\0')。这些都会让后续 printf("%s", result) 或 strlen(result) 读到非法内存。
另一个隐形问题是:如果原始字符串来自字面量(如 "abc"),它们存在只读段,不能被修改;但如果你误把拼接结果写回其中一段,程序会直接 SIGSEGV。
实际项目里,除非有明确性能/嵌入式约束,否则优先用 std::string;非要用 char* 拼接,就老老实实算长度、申请、复制、置零——少一步,运行时就可能崩。


















