You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++数组声明时赋值与声明后赋值的编译差异咨询

为啥C++里数组声明时赋值没问题,之后再赋值就报错?

这俩写法看着像,但其实是完全不同的操作——一个是数组初始化,一个是数组赋值,C++对这俩的规则天差地别:

1. 声明时的char c[5] = "Hey!"是初始化,合法!

当你在定义数组的同一行直接给它赋值,这属于初始化操作。编译器会在为数组分配内存的同时,把字符串"Hey!"的每个字符(包括末尾的\0)逐个拷贝到数组的内存空间里。这是C++标准明确允许的语法,相当于给数组“天生”就设定好初始值。

代码示例:

#include <iostream>
int main() {
    char c[5] = "Hey!"; // 完全合法:数组初始化
}

2. 后来的c = "Hey!"是赋值操作,C++不允许!

在C++里,数组名本质上是一个指向数组首元素的常量指针——它的值(也就是数组所在的内存地址)是固定的,不能被修改。当你写c = "Hey!"时,"Hey!"是一个字符串字面量,它存放在内存的只读区域里,你试图把这个区域的地址赋值给数组名c,但c是个常量,不能被重新赋值,所以编译器就会报错expression must be a modifiable lvalue(意思是:你要赋值的东西得是个能被修改的左值,但数组名不是)。

错误代码示例:

#include <iostream>
int main() {
    char c[5];
    c = "Hey!"; // 非法:数组不能直接赋值
}

那想给已有的数组赋值该咋整?

如果要给已经创建好的数组更新内容,得用字符串拷贝函数,比如strcpy(记得包含<cstring>头文件):

#include <iostream>
#include <cstring>
int main() {
    char c[5];
    strcpy(c, "Hey!"); // 合法:把字符串内容拷贝到数组里
}

当然你也可以手动逐个元素赋值,但显然strcpy更省心。


内容的提问来源于stack exchange,提问作者Shayan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:04:50