【问题标题】:If string arrays are null terminated in C, why are arrays of other data types not null terminated?如果字符串数组在 C 中以 null 结尾,为什么其他数据类型的数组不以 null 结尾?
【发布时间】:2019-10-28 12:24:07
【问题描述】:

C 中的字符串或字符数组必须以 null 结尾才能知道它们在哪里结束。为什么相同的规则不适用于其他类型的数组? 例如。计算机如何知道整数数组的结束位置?整数/浮点数/双精度数组在内存中的表示方式有什么不同吗?

【问题讨论】:

  • C 字符串和“字符数组”不是一回事。字符数组不必以 0 结尾。
  • Why does the same rule not apply to arrays of other types? - 确实如此。一些库需要空/零/一些额外的字符分隔数据。从我的头顶,前。 getopt_long 使用以{0,0,0,0} 终止的数组。碰巧“字符串”是由 C 标准定义的,而 C 标准库支持它们。
  • @KamilCuk 为什么还要去第三方库? main 中的 argv 已经是空指针终止的 :)
  • “其他数据类型”可以包含多个零,它们是这些类型的合法成员。所以零不能是有效的数组结束标记。
  • 这是一个很好的例子——argcargv 可能是这两种方法的一个例子——你在argc 中有计数,但argv 仍然是空终止的。这只是一个约定。它用于最适合用例的情况。

标签: c arrays string


【解决方案1】:

简短回答:因为这就是 C 语言的定义方式。

更长的答案:C 字符串本身并没有什么特别之处。它们是一个包含字节的内存块,就像任何其他块一样。但是通过定义以 0 结束字符串的约定,所有函数都可以就处理字符串的方式达成一致。

它们可能以强制您单独处理长度并始终为每个函数提供指针和长度的方式完成。这很麻烦,所以最好只使用终结器。在连接等情况下,它也更慢,因为首先必须查找结束位置。

至于为什么它不与其他类型一起使用,有时是。原因是一样的:它被认为是一种约定,与字符串的方式相同。我们不知道有多少值,所以最后我们有一个哨兵值。它可能是 null、0 或其他一些值。但是我们也不能这样做并单独提供元素的数量。

通常不可能和/或不需要使用标记值,例如,如果我们需要整个数据类型或知道数据的大小。例如,如果我们有一个 RGB 图像,我们将如何定义最终值?我们需要字节可以拥有的所有值来定义颜色,所以我们不能有哨兵。我们也不需要一个,因为我们知道图像的大小。

至于计算机,它对数据一无所知。它只能处理字节和单词以及它构建来处理的任何东西。字符串更高级别,完全在使用的语言库中处理。处理器只是根据你告诉它做什么来移动数据。例如,PC BIOS 在打印字符串时使用 $ 作为终止符,而不是 0。

【讨论】:

    【解决方案2】:

    字符数组不必以 nul 结尾。

    char foo[3]="foo"; //not nul-terminated
    char bar[]={'b','a','r'}; //not nul-terminated
    

    只是字符串字面量是 nul 终止的数组,而 C 通过使用字符串字面量作为初始值设定项可以很容易地制作 nul 终止的数组:

     char baz[]="baz"; //nul-terminated because "baz" is
    

    为什么 C 这样做是设计者做出的选择,因为 using a terminator seemed more convenient to them than maintaining character counts 紧挨着字符数组。

    但 C 语言中没有任何东西会强迫你选择这种偏好。

    【讨论】:

    • string literalstring 是相似的,但不同的 C 事物。 stringarray of character 问题的答案使用 string literal 更加复杂。
    【解决方案3】:

    您通常将数组的长度与指针一起传递。没有任何东西“知道”任何东西的长度。

    记忆就是记忆。一个字节数组中可能有 0x42 0x41 0x44 0x00,恰好是“BAD”的字符串,但它也可以是表示“1145127936”的整数或表示“773.0625”的浮点数

    【讨论】:

      【解决方案4】:

      C 中的字符串是一个以 null 结尾的 char 序列。这是char 数组的一个特例。

      你可以有一个char 数组,它 以null 结尾。例如:

      char x[] = { 'a', 'b', 'c' };
      

      数组通常表示为内存中基本类型的连续序列。语言本身不会跟踪数组的大小,您应该自己做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-09
        • 2021-01-22
        • 1970-01-01
        • 2011-05-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 2011-09-11
        相关资源
        最近更新 更多