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*的主要内容,如果未能解决你的问题,请参考以下文章