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

Posted

技术标签:

【中文标题】C/C++ 将 char 数组初始化为 const char*【英文标题】:C/C++ Initialise char array to const char* 【发布时间】:2017-02-20 23:34:18 【问题描述】:

假设我有一个 char 数组,这样就可以了:

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";吗? 我在 arduino 上使用 C++,我认为这方面的语言是相似的,如果不是,请解释它们有何不同 hello 的类型与myChars 完全不同。这就像试图从一只猫初始化你的奶奶。 (相比之下,"hello"myChars 具有相当相似的类型以使初始化有意义。) strcpy() 是你的答案。 我删除了 C 标签。选择一种语言。 【参考方案1】:

因为指针不是数组,数组也不是指针。

这些例子是不等价的;字符串文字"hello" 不是一个指针,而是一个const char[6],它可以用来初始化你的char myChars[100] 作为一个特例。

但是,如果您首先将其衰减为指针,则以后无法再恢复该数组。在一般情况下,编译器无法知道数组有多大,或者它甚至是一个。因此,从指针初始化数组是无效的,无论之前发生了什么。

【讨论】:

所以const char hello[6] = "hello";然后char myChars[100] = hello;仍然是非法的,这不是char myChars[100] = "hello";的等效语句吗? @jdex。不,你需要像电脑一样思考。 char myChars[100] = "hello"; 表示创建一个包含 100 个元素的数组,并让语法糖 a special rule to make things easier 使用字符串文字的副本对其进行初始化。 char myChars[100] = hello; 表示创建一个 100 个字符的数组并尝试使用指针对其进行初始化。从指向 char 的指针到指向字符串字面量的指针的最后一次逻辑飞跃没有语法糖。 @jdex:您已经解决了类型问题,但现在您遇到了一个更一般的规则,即不能复制数组(字符串文字的特殊情况除外)。现在,由于历史原因,我们进入了可能令人惊讶的例外领域。这两个语句不等价,因为"hello" 是文字,而hello 是变量。对不起!【参考方案2】:

你需要区分指针数组

下面定义了一个指向常量文本的指针:const char* hello="hello";

下面定义了一个数组:char myChars[100];

您正在尝试将指针分配给数组的单个槽:char myChars[100] = hello;

最好的办法是使用std::string

在嵌入式编程中,我经常使用:static const char hello_text[] = "Hello";

我让编译器确定数组的大小。

【讨论】:

您正在尝试将指针分配给数组的单个插槽::并非如此。这不是赋值,而是初始化,并且指针不是 char 数组的正确初始化器。【参考方案3】:
char myChars[100] = hello;

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

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

char myChars[100] = "hello";

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

"hello" 'h', 'e', 'l', 'l', 'o', '\0' 都将推导出char[6] 数组类型,可用作myChars 的初始化代码。

【讨论】:

以上是关于C/C++ 将 char 数组初始化为 const char*的主要内容,如果未能解决你的问题,请参考以下文章

将 const char[] 初始化为非静态类成员

初始化静态 const char* 数组

C ++ - Char数组以某种方式初始化为错误的大小

从 const char* 复制到字节数组 C++/c# interop Marshal::Copy

memset用法总结

具有 char 数组的 C++ 结构以不寻常的方式初始化为零