直接用=赋值字符数组会报错,因数组名不可赋值;应使用strcpy或strncpy复制内容,或定义时初始化,现代C++推荐用std::string。

直接用 = 赋值会报错:数组类型不可赋值
字符串常量(比如 "hello")本质是 const char[6] 类型,而字符数组(如 char buf[10])是可修改的左值。C++ 不允许对数组名使用赋值运算符,编译器会直接报错:error: array type 'char [10]' is not assignable。
常见错误写法:
char arr[10]; arr = "abc"; // ❌ 编译失败
正确思路是「复制内容」,不是「赋值数组名」。
用 strcpy 或 strncpy 复制字符串内容
这是最常用、最直观的方式,前提是目标数组足够大,且已包含 <cstring>。
立即学习“C++免费学习笔记(深入)”;
-
strcpy(dest, src):不检查长度,必须确保dest足够容纳src(含末尾\0),否则缓冲区溢出 -
strncpy(dest, src, n):最多拷贝n字节,但不保证结果以\0结尾(当src长度 ≥n时)
推荐写法(带长度检查):
char buf[10]; strncpy(buf, "hello", sizeof(buf) - 1); buf[sizeof(buf) - 1] = '\0'; // 确保结尾有 \0
初始化时直接用字符串字面量(仅限定义时)
如果是在定义字符数组的同时赋初值,可以用字符串字面量,编译器会自动逐字符初始化并补 \0:
char arr1[] = "abc"; // ✅ 自动推导为 char[4],内容 'a','b','c','\0' char arr2[10] = "xyz"; // ✅ 剩余位置自动填 '\0'
但注意:
- 这只能在定义语句中做,之后不能再用
= "..."赋值 -
char arr[5] = "hello"是非法的(长度不够存 6 字节) - 省略大小写
char arr[] = "..."最安全,避免手动算长度
C++11 起更推荐用 std::string 替代字符数组
手动管理字符数组容易出错,尤其涉及拼接、截取、动态长度时。现代 C++ 应优先考虑:
std::string s = "hello"; // ✅ 安全、可变长、支持 = 赋值 s = "world"; // ✅ 合法,底层自动处理内存
只有在必须对接 C 接口(如系统调用、旧库函数)或极致性能/栈空间受限场景下,才需用原始字符数组。这时务必确认目标缓冲区大小,并显式保证 \0 终止。
最容易被忽略的是:即使用了 strncpy,也得手动补 \0——它不总是帮你做这件事。


















