【问题标题】:Initialisation of Character Arrays [duplicate]字符数组的初始化[重复]
【发布时间】:2016-11-20 00:20:42
【问题描述】:

如果我们在 C 中声明一个字符数组

例如:

char label[] = "Hello";

我们将在内存中有一个如下所示的数组

--------------------------
| H | e | l | l | o | \0 |
--------------------------

在数组末尾添加额外的空字节。

场景 1:

char label[10] = "Hello";

------------------------------------------ 
| H | e | l | l | o | \0 |   |   |   |   | 
------------------------------------------ 

它将有额外的 4 个未使用的位置。

场景 2:

如果我们正好有一个 10 个字符的字符串,是否还会添加 \0(空字节),这使得 char 数组可以容纳 11 个字符?

char label[10] = "0123456789";

----------------------------------------- 
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 
----------------------------------------- 

              OR

----------------------------------------------
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | \0 |
----------------------------------------------

【问题讨论】:

  • 使用label[10],您可以将数组定义为正好有 10 个符号。因此,编译器不能添加第 11 个符号 (\0)。通常,您会收到一条警告,指出字符串初始化对于数组来说太长了。
  • 仅供参考,C++ 不允许您使用超过 9 个字符来初始化 char label[10](当然,它会为第十个字符添加一个空字节)。 C 没有该规则(但您不能将第 11 个字符显式添加到初始化程序)。

标签: c arrays initialization c-strings


【解决方案1】:

你的理解几乎是正确的:

char label[10] = "Hello";

将使用 | H | e | l | l | o |\0|\0|\0|\0|\0| 初始化一个 10 字节的 char 数组。

而对于最后一种情况:

char label[10] = "0123456789";

数组也是 10 char 长,初始化为 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |。因此,此数组以空结尾,不应用作 C 字符串。

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 2010-12-03
    • 2013-07-05
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    相关资源
    最近更新 更多