C语言中的数组结尾

10

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

我猜测它不是像'\0'这样的特殊字符,因为例如声明一个n个整数元素的整数数组时,只需分配n * sizeof(int)的空间,但对于字符数组,我们需要考虑'\0'。


4
在使用数组前,需要知道数组的长度。\0字符(也称为空终止符,因为其ASCII值为0)只是用于打印函数知道何时停止打印字符串。 - SomethingSomething
1
除非您为特定的数组类型使用自己的特殊标记值,否则将什么也没有。 - Shawn
1
如果一个特殊值不可能出现在数组中,可以使用哨兵值;否则 '\0' 是区分数组和字符串的关键。 - Weather Vane
1
@SomethingSomething 这取决于你如何定义对象。在C标准中,即使是普通变量也被称为对象。 - klutt
1
@SomethingSomething 奇怪的答案。既然我们在谈论C语言,我认为C标准非常相关。 - klutt
显示剩余5条评论
4个回答

9

C语言中的数组没有结束标记。

作为程序员,你需要跟踪数组分配的大小,确保不会试图访问超出分配大小的元素。

如果你确实访问了超出分配大小的元素,结果将是未定义行为


2

字符数组就是一个类型为char[]的数组。它没有任何标识它结尾的东西。你所说的是字符串,它是以null结尾的char数组。更准确地说,它是以null结尾的连续字符序列。从技术上讲,它不需要是一个数组。

考虑这段代码:

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

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

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

C标准7.1.1.1

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

因此,简而言之,数组根本没有终止符,即使是字符数组也没有。最接近的是sizeof,它将给出分配给数组的空间,但它不能像空终止符一样使用。如果您动态分配了空间或正在使用指针访问数组,则甚至不能使用sizeof。好吧,你可以使用,但你得不到你想要的大小。


0
字符串以null结尾的原因是为了方便。这是许多字符串处理常用程序采用的约定。
如果您记录其长度,也可以处理没有null结尾的字符串。同样,除非您想使用哨兵值终止数组,否则需要记录数组的长度 - 但不要指望任何现成的函数能够理解它。

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 */
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接