【问题标题】:Array of pointers to strings指向字符串的指针数组
【发布时间】:2014-11-29 18:13:26
【问题描述】:

我们知道 c 会自动在字符数组的末尾插入 NULL(\0)。但是为什么它不会在指向字符串的指针数组的末尾插入 NULL 字符。

例如:如果我写

char name[]={40,20,30,20,22,22,'c','a','b'}

NULL 字符将被自动添加。但是如果我创建一个类型为 Char 的指针数组 不会在数组末尾添加空字符 例如

char *names[]={"aaa","bbb","cccc"}

【问题讨论】:

  • 不,我们并不都知道,因为第一部分不正确。无论如何,你的问题是什么?
  • 字符数组和字符串是有区别的。
  • 字符串常量是由 NUL 终止的一维字符数组。例如 char name[]={'H','A','\0'}; @hacks
  • 所有的鸡都是鸟,所以所有的鸟都是鸡? (鸟 = 字符数组,鸡 = 字符串文字或从它们初始化的数组)。
  • Thnaku 我得到了它@hacks 特别感谢 junachopaza

标签: c arrays string pointers


【解决方案1】:

C not 对字符数组(或任何其他数组)执行此操作,它对字符串文字(例如"xyzzy")执行此操作。 ISO C标准的相关位,C11 6.4.5 String literals /7

在翻译阶段 7,一个字节或零值代码被附加到每个多字节 由一个或多个字符串文字产生的字符序列。多字节字符 然后使用序列来初始化一个静态存储持续时间和长度的数组 足以包含序列。

对于字符串字面量,数组元素的类型为 char,并使用多字节字符序列的各个字节进行初始化。

这样做的原因是因为它知道您希望字符串以空值结尾,否则它们实际上根本不是 C 字符串。

如果您确实碰巧在非字符串文字字符数组 name 的末尾找到了一个终止符,那纯属巧合,依赖它会进入未定义的行为领域。 p>

【讨论】:

    【解决方案2】:

    您的理解不正确。你说,

    例如:如果我写

    char name[]={40,20,30,20,22,22,'c','a','b'}

    NULL 字符将被自动添加。

    这不是真的。

    如果你使用:

    char name[] = "abc";
    

    添加了一个终止空字符,但不是您使用的形式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 2013-09-27
      • 1970-01-01
      相关资源
      最近更新 更多