【问题标题】:End of array in C languageC语言中数组的结尾
【发布时间】:2018-12-02 09:57:07
【问题描述】:

我们知道,对于字符数组,我们有 '\0' 来标识它的结尾,那么其他类型的数组呢?

我认为它不是一个特殊字符,例如 '\0',因为要声明一个包含 n 个元素的整数数组,例如您只需分配 n * sizeof(int),但对于字符数组,我们会考虑 '\0 '。

【问题讨论】:

  • 需要提前知道数组长度。 \0 字符(也称为 NULL 终止符,因为 \0 的 ASCII 值为 0)只是为了让打印函数知道何时停止打印字符串。
  • 除非您为特定的数组类型使用自己的特殊标记值,否则什么都没有。
  • 如果数组中不能出现标记值,您可以使用它,否则'\0' 是数组和字符串之间的区别。
  • C 字符串是使用 char 数组定义的事实,以及 C 数组不是对象且不包含其长度作为字段的事实,需要定义终止符
  • @SomethingSomething 取决于您如何定义对象。在 C 标准中,即使是常规变量也被称为对象。

标签: c arrays


【解决方案1】:

C 数组没有结束标记。

作为程序员,您有责任跟踪数组的分配大小,以确保您不会尝试访问分配大小之外的元素。

如果您确实访问了超出分配大小的元素,则结果为undefined behaviour

【讨论】:

    【解决方案2】:

    字符数组只是char[] 类型的数组。它没有任何东西可以识别它的结束。你所说的是一个 c-string,它是一个以空字符结尾的字符数组。或者更正确地说,一个以空字符结尾的连续字符序列。从技术上讲,它不需要是一个数组。

    考虑这段代码:

    char * p = malloc(20);
    strcpy(p, "Hello, World!");
    

    指针 p 现在将指向一个不是数组的 c 字符串。

    char数组不需要以\0结尾,但如果是,它就是一个c字符串。

    C 标准 7.1.1.1

    字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。 术语多字节字符串有时用于强调对字符串中包含的多字节字符进行特殊处理或避免与宽字符串混淆。指向字符串的指针是指向其初始(最低地址)字符的指针。字符串的长度是空字符之前的字节数,字符串的值是包含的字符的值的顺序,按顺序排列。

    简而言之,数组根本没有终结符。甚至没有字符数组。最接近的是sizeof,它将为您提供为数组分配的空间,但它的工作方式与空终止符不同。如果您已动态分配空间,或者正在使用指针访问数组,您甚至不能使用sizeof。好吧,你可以,但你不会得到你想要的尺寸。

    【讨论】:

      【解决方案3】:

      字符串以空结尾的原因是为了方便。这是大量库存程序采用的用于字符串处理的约定。

      可以处理没有空终止符的字符串,如果您记录它们的长度。同样,您需要记录数组的长度,除非您想用标记值终止它们 - 但不要指望任何现成的函数能够理解这一点。

      【讨论】:

        【解决方案4】:

        您可以在 C 中以不同的方式声明字符串(C 中不存在实际的字符串类型):

        char MyStr[5] = "Jack"; 
        char * MyStr  = "Jack"; 
        char MyStr[5] = {'J','a', 'c', 'k', '\0'};
        

        在情况 1 和 2 中,当编译器遇到 " " 时,它会在末尾附加一个空字符 '\0'。 在最后一种情况下,您应该手动附加它(按照惯例,您使用 '\0'),但要点是不要访问数组之外​​的元素。

        例子:

        while (*Mystr) /* Check against NULL char*/
        {
          /* Do something */
        }
        

        如果您使用指向字符类型的指针,则在声明后不能再更改它,因为它将存储在只读段中。

        【讨论】:

          猜你喜欢
          • 2015-06-07
          • 2021-08-29
          • 2015-08-19
          • 1970-01-01
          • 2013-01-23
          • 2020-06-18
          • 2021-11-15
          • 1970-01-01
          相关资源
          最近更新 更多