【问题标题】:static char array declaration in CC中的静态char数组声明
【发布时间】:2015-07-29 12:57:25
【问题描述】:

有人可以向我解释为什么int array[3] = {1,2,3} 工作但 char array[3] = "123" 不起作用?

它打印出“123((”而不是“123”。

它说对于 char 数组需要另一个空格来存放空字符,但数组不是从 0 开始的,所以 char array[3] 就足够了,因为它实际上是 4 个空格。除非 char 数组实际上需要 2 个空格,一个用于 null,一个用于特殊字符。

【问题讨论】:

    标签: c arrays char


    【解决方案1】:

    在 c 中声明一个数组时,char array[3] 将产生 3 个字符,而不是像您在问题中建议的那样产生 4 个字符。您确实需要在字符串末尾为空字符留出空间,因此在这种情况下您需要 char array[4]。

    【讨论】:

      【解决方案2】:
      int array[3] = {1,2,3}
      

      分配一个最多可以容纳 3 个整数的数组,您可以使用以下方式访问其中的任何一个:

      array[0]
      array[1]
      array[2]
      

      这里:

      char array[3] = "123"
      

      "123" 由 4 个字节组成。字符串文字中的字符以 NUL 终止符结尾。但是您分配 3 个字节并且最多可以容纳 2 个字符(NUL 终止符为 +1)。因此,当您使用它初始化数组时,'\0' 不会写入,因为没有空间。

      当您在printf 中使用%s 打印此内容时,它会调用Undefined behavior,因为%s 会打印所有内容,直到出现NUL 终止符。因此,printf 继续从无效内存位置读取值,直到'\0'。当你这样做时,任何事情都可能发生。您可能会看到随机垃圾输出、崩溃、分段错误等。基本上,您不应该依赖这种行为,即使它似乎按预期“工作”了。

      但数组不是从 0 开始

      是的

      所以char array[3] 就足够了,因为它实际上是 4 个空格

      错了。 char array[3] 的有效索引是

      array[0]
      array[1]
      array[2]
      

      访问array[3] 是错误的,它会调用Undefined Behavior


      使用

      解决问题
      char array[4] = "123";
      

      或更好:

      char array[] = "123";
      

      空括号告诉编译器确定数组的大小。

      【讨论】:

      • 访问array[3]当然是未定义的行为,但array本身的初始化是明确定义的,所以上面array的初始化等价于char array[] = { '1', '2', '3' };。空终止符的空间不是必需的。另一方面,char array[3] = "1234"; 未定义,因为“任何初始化程序都不应尝试为未包含在正在初始化的实体中的对象提供值”(C11 草案 N1570 6.7.9p2),这意味着 array 太小而无法包含4 个元素{ '1', '2', '3', '4' }。 N1570 的 6.7.9p32 表达了预期的行为。
      • @ChronoKitsune ,我不知道!那么,'\0' 没有提供?
      • 如果有足够的空间,则包含空终止符,但不是必须的。从技术上讲,任何多余的元素都会被初始化为 0,所以即使没有添加字符串文字的空终止符,如果数组长度大于字符串文字的长度,数组仍然会被终止。
      猜你喜欢
      • 1970-01-01
      • 2018-01-12
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多