【问题标题】:C/C++ Initialise char array to const char*C/C++ 将 char 数组初始化为 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 标签。选择一种语言。

标签: c++ arrays initialization


【解决方案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 的初始化代码。

【讨论】:

    猜你喜欢
    • 2016-11-21
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多