c++中应优先使用std::String,仅在需控制内存布局、嵌入式开发或对接C API时选用char[];前者安全易用、自动管理内存,后者轻量但易致溢出或崩溃。

在C++中,字符串处理有两种主流方式:C风格的字符数组(char[])和标准库的std::string。它们根本不是“替代关系”,而是面向不同场景的设计——前者轻量、贴近硬件,后者安全、易用。选错可能带来缓冲区溢出、内存泄漏或冗余代码。
内存管理方式完全不同
char[] 是栈上固定大小的连续内存块,长度在编译期决定,不能动态增长;std::string 内部用堆内存+动态扩容机制(如倍增策略),大小运行时可变。
- 写
char name[10] = "Alice";—— 占10字节,多出的4字节是预留空间,但你不能往里塞11个字符 - 写
string name = "Alice"; name += " Smith";—— 自动申请新内存、复制、释放旧内存,你几乎不用操心 - 忘记给
char[]预留末尾' '或越界写入,程序可能当场崩溃或静默出错
操作接口与安全性差异明显
char[] 依赖C标准库函数(strcpy、strcat、strlen等),不检查边界,无返回值校验;std::string 所有操作都是成员函数,自带长度记录、自动终止符管理、异常安全(如 at() 下标访问会抛 out_of_range)。
- 拼接两个
char[]?得先算长度、确保目标数组够大、再调strcat—— 三步错一步就危险 -
string a="Hi", b="World"; string c = a + b;—— 一行搞定,还能链式调用.substr(1,3).find("or") -
string支持迭代器、范围for、隐式转换为const char*(用.c_str()),兼容C接口又不失现代性
什么时候该用 char[]?
不是“过时了就不用”,而是明确需要控制内存布局、嵌入式环境、性能极致敏感、或对接C API时才选它。
立即学习“C++免费学习笔记(深入)”;
- 函数参数要求
const char*(比如fopen()、printf())—— 可用str.c_str()安全传入 - 定义只读字符串字面量:
const char* msg = "Error: not found";比string更省内存 - 单片机或实时系统中避免堆分配——此时
char buf[64]是合理选择
初学者常见误区提醒
别把 char[] 当 string 用,也别以为 string “一定更慢”而盲目回避。
- 写
char s[] = "hello"; s[0] = 'H';✅ 合法;但char* s = "hello"; s[0] = 'H';❌ 未定义行为(字面量存在只读段) -
string的+和+=效率不差,小字符串通常启用短字符串优化(SSO),不触发堆分配 - 用
sizeof(char[])得到的是数组总字节数;对string用sizeof只得到对象本身大小(约24–32字节),不是内容长度
基本上就这些。记住:日常开发优先用 std::string,写底层或interop时再碰 char[]。两者共存不矛盾,关键在理解各自边界。