C中数组名不是左值,不能整体赋值;正确做法是用strcpy或memcpy逐字节写入,或定义时初始化。

array type 'char [x]' is not assignable 这类错误不是 Clang 特有,而是 C 语言语法限制的直接体现:**C 中数组名不是左值,不能整体赋值**。Clang 报这个错,说明你写了类似 p = "abc" 或 a = b(其中 a、b 是数组)这样的语句。
为什么 char 数组不能直接赋值?
C 标准规定,数组类型在大多数上下文中会退化为指针(即首地址),但退化后的指针是右值,不能作为赋值操作的左侧目标。换句话说:char buf[10]; buf = "hello"; 是非法的——buf 在这里不是变量名意义上的“容器”,而是一个不可修改的地址常量。
这和 int x; x = 5; 有本质区别:前者试图把整个内存块“换掉”,后者只是改一个标量值。
正确做法:用 strcpy 或 memcpy 替代赋值
要改变数组内容,必须逐字节写入。标准库提供了安全、明确的替代方式:
- 字符数组 → 用
strcpy(需#include <string.h>),注意目标空间必须足够大且以\0结尾 - 任意类型数组 → 用
memcpy,需手动传入字节数(如sizeof(int) * n) - 若目标是初始化阶段,直接在定义时赋初值:
char s[] = "hello";合法,因为这是初始化,不是赋值
示例:
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
#include <string.h>
int main() {
char dst[10];
strcpy(dst, "hi"); // ✅ 正确
// dst = "hi"; // ❌ 编译报错:array type 'char [10]' is not assignable
}容易踩的坑:混淆指针与数组
常见误判是以为 char *p = malloc(10); p = "abc"; 和数组赋值一样——其实它合法,但行为完全不同:p 是指针变量,"abc" 是字符串字面量地址,这条语句只是让 p 指向新地址,并未拷贝内容,还导致之前 malloc 的内存泄漏。
更危险的是:char arr[] = "test"; char *p = arr; p = "new"; —— 这不会改 arr 的内容,只改了 p 的指向。
真正想“替换数组内容”时,必须用 strcpy 或循环赋值,不能靠指针重定向来蒙混过关。
最常被忽略的一点:错误信息里出现的 char [9]、const char [5] 等长度,其实是编译器在帮你定位问题范围。看到这些数字,立刻检查左右两边数组声明长度是否匹配、目标缓冲区是否足够容纳源字符串(含结尾 \0),否则 strcpy 会越界。

















