2

NULL(或 0 或 '\0')在 unsigned char 数组和 char 数组中的表现如何?在 char 数组中,NULL 确定 char 数组的结尾。unsigned char 数组的情况是否相同?如果不是,我们如何确定 unsigned char 数组的结尾?

4

2 回答 2

3

的确切定义NULL是实现定义的;所有可以保证的是它是一个扩展为空指针常量的宏。反过来,空指针常量是“整数类型的整数常量表达式 (5.19) 纯右值,其计算结果为零或类型的纯右值std::nullptr_t”。它可能会也可能不会转换为charor unsigned char;它应该只与指针一起使用。

0int是一个值为零的类型的文字。'\0'是 char 类型的文字,其值为零。无论是隐式转换为unsigned char,产生零值。

C 和 C++ 中的字符串通常表示为以char第一个零值结尾的 s 序列,这纯粹是一种约定。没有什么可以阻止您声明不遵循此约定的 char 数组:

char embedded_zero[] = {'a', '\0', 'b'};

当然,期望其参数遵循约定的函数将在第一个零处停止:strlen(embedded_zero) == 1;.

当然,您可以编写一个采用unsigned char*并遵循类似约定的函数,要求调用者使用具有零值的元素来指示序列的结尾。或者,您可以编写一个函数,该函数采用第二个参数来指示序列的长度。您决定哪种方法更适合您的设计。

于 2013-10-24T01:57:27.240 回答
2

严格来说,'\0'表示字符串文字的结尾,而不是任何char数组的结尾。例如,如果您声明一个数组而不将其初始化为字符串文字,则其中将没有结束标记。

但是,如果您使用字符串文字初始化 s 数组unsigned char,您将获得与'\0'常规字符数组相同的结束标记。换句话说,在下面的代码中

char s[] = "abc";
unsigned char u[] = "abc";

s[3]u[3]包含 的相同值'\0'

于 2013-10-24T01:57:20.200 回答