C/C++ 将字符数组初始化为 const char*

6

假设我有一个字符数组,这是可以的:

char myChars[100] = "hello";

但是如果我有一个
const char* hello="hello";
char myChars[100] = hello;

或者

const char hello[6]="hello";
char myChars[100] = hello;

不允许这样做:

error: array must be initialized with a brace-enclosed intializer

似乎这些语句基本等价,为什么会这样?

你尝试过使用 const char myChars[] = "Hello"; 吗? - Thomas Matthews
我在arduino上使用C ++,我认为这些语言在这个领域很相似,如果不是,请解释它们的区别。 - jdex
1
“hello”和“myChars”的类型完全不同。这就像试图用猫初始化你的奶奶一样。(相比之下,“hello”和“myChars”的类型相对类似,因此初始化才有意义。) - Kerrek SB
1
strcpy() 是你的答案。 - Malcolm McLean
1
我删除了C标签。选择一种语言。 - Lightness Races in Orbit
显示剩余7条评论
3个回答

9
因为指针不是数组,而数组也不是指针。
这些示例是不等效的;字符串文字“hello”不是指针,而是一个const char[6],它可以用来初始化你的char myChars[100]作为一种特殊情况。
然而,如果你先让它衰变成指针,你就不能再把数组性质拿回来了。在一般情况下,编译器无法知道数组的大小,或者甚至根本不是数组。因此,从指针初始化数组是无效的,无论之前发生了什么。

所以现在仍然是非法的做法 const char hello[6] = "hello"; 然后 char myChars[100] = hello;,这不就等同于 char myChars[100] = "hello"; 吗? - jdex
2
@jdex。不行。你需要像计算机一样思考。 char myChars [100] =“hello”; 表示创建一个包含 100 个元素的数组,并让语法糖,一种使事情更容易的特殊规则,用字符串文本的副本初始化它。 char myChars [100] = hello; 表示创建一个包含 100 个字符的数组,并尝试使用指针初始化它。没有语法糖可以从指针到“char”再到字符串文本的指针做出最后的逻辑跳转。 - user4581301
@jdex:你已经解决了类型问题,但现在你遇到了一个更普遍的规则,即数组不能被复制(除了字符串字面量的特殊情况)。现在我们进入了可能会出乎意料的例外领域,这些例外是由于历史原因而存在的。这两个语句不等价,因为“hello”是一个字面量,但“hello”是一个变量。抱歉! - Lightness Races in Orbit

5
您需要区分指针和数组。
以下定义了一个常量文本的指针:
const char* hello="hello"; 以下定义了一个数组:
char myChars[100]; 您正试图将指针赋值给数组的单个插槽:
char myChars[100] = hello; 您最好使用std::string
在嵌入式编程中,我经常使用:
static const char hello_text[] = "Hello"; 我让编译器确定数组的大小。

2
你正在尝试将指针分配给数组的单个插槽:实际上并不是这样。这不是一次赋值,而是一次初始化,并且指针不是char数组的适当初始化器。 - chqrlie

2
char myChars[100] = hello;

一个 char[] 数组不能从指针类型 (hello) 初始化,因为它们的类型不同。

正如编译器错误信息所说,可以使用 char 数组字面量进行初始化,例如:

char myChars[100] = "hello";

或者

char myChars[100] = { 'h', 'e', 'l', 'l', 'o', '\0' };

"hello"{ 'h', 'e', 'l', 'l', 'o', '\0' }都可以转化为char[6]数组类型,并可用作myChars的初始化代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接