NULL(或0或'\ 0')在unsigned char数组和char数组中的表现如何?在char数组中,NULL确定char数组的结尾。是否与unsigned char数组相同?如果不是,我们如何确定unsigned char数组的结束?
答案 0 :(得分:3)
NULL
的确切定义是实现定义的;所有这一切都得到保证,它是一个扩展为空指针常量的宏。反过来,空指针常量是“整数类型的整数常量表达式(5.19)prvalue,其计算结果为零或者std::nullptr_t
的prvalue”。它可能会或可能不会转换为char
或unsigned char
;它应该只与指针一起使用。
0
是int
类型的文字,其值为零。 '\0'
是char类型的文字,其值为零。要么可以隐式转换为unsigned char
,要么产生零值。
纯粹是一种惯例,C和C ++中的字符串通常表示为以{0}结尾的char
s序列。没有什么可以阻止您声明不遵循此约定的char数组:
char embedded_zero[] = {'a', '\0', 'b'};
当然,期望其参数遵循约定的函数将停在第一个零点:strlen(embedded_zero) == 1;
。
当然,您可以编写一个采用unsigned char*
并遵循类似约定的函数,要求调用者使用零值的元素指示序列的结尾。或者,您可以编写一个函数,该函数采用指示序列长度的第二个参数。您决定哪种方法更适合您的设计。
答案 1 :(得分:2)
严格地说,'\0'
表示字符串文字的结尾,而不是任何char
数组的结尾。例如,如果声明一个数组而不将其初始化为字符串文字,则其中不会有结束标记。
但是,如果使用字符串文字初始化unsigned char
的数组,则会获得与常规字符数组中相同的'\0'
结束标记。换句话说,在下面的代码中
char s[] = "abc";
unsigned char u[] = "abc";
s[3]
和u[3]
包含相同的'\0'
值。