C语言数组的结尾

时间:2018-12-02 09:57:08

标签: c arrays

我们知道对于字符数组,我们使用'\ 0'标识其结尾,其他类型的数组呢?

我认为它不是特殊字符,例如'\ 0',因为要声明一个由n个元素组成的整数数组,例如,您只分配n * sizeof(int),但是对于字符数组,我们将其记为'\ 0 '。

4 个答案:

答案 0 :(得分:3)

C数组没有结束标记。

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

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

答案 1 :(得分:2)

字符数组只是类型为char[]的数组。它没有任何东西可以标识它的结局。您所谈论的是一个 c-string ,它是一个以null终止的char数组。或更准确地说,是一个以零结尾的连续字符序列。从技术上讲,它不必是数组。

考虑以下代码:

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

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

char数组不需要以\0结尾,但如果是,则为c字符串。

  

C标准7.1.1.1

     

字符串是一个连续的字符序列,以第一个空字符结尾并包含第一个空字符。术语“多字节字符串”有时用于代替强调字符串中包含的多字节字符的特殊处理,或者避免混乱与宽弦。指向字符串的指针是指向其初始(最低寻址)字符的指针。字符串的长度是空字符之前的字节数,而字符串的值依次是所包含字符的值的顺序。

因此,简而言之,数组根本没有终结符。甚至没有字符数组。最接近的是sizeof,它将为您分配为数组分配的空间,但它的工作方式与null终止符不同。如果您已经动态分配了空间,或者正在使用指针访问数组,则甚至不能使用sizeof。可以,但是不会获得所需的大小。

答案 2 :(得分:1)

字符串以空值终止的原因是为了方便。大量的存储过程都采用这种约定来处理字符串。

如果保持记录字符串的长度,则可以处理不带空终止符的字符串。以同样的方式,您需要记录数组的长度,除非您希望以定点值终止它们-但是不要期望任何现成的函数能够理解这一点。

答案 3 :(得分:0)

您可以在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 */
}

如果使用指向字符类型的指针,则声明后将无法再对其进行更改,因为它将存储在只读段中。