unsigned char[] 中的隐藏字节

Hidden byte in unsigned char[]

unsigned char blind[32] = "and my kingdom too for a blinder";

这给出了错误:

a value of type "const char [33]" cannot be used to initialize an entity of type "unsigned char [32]"C/C++(144)

我不明白为什么会报错。

我正在尝试在 C++ 项目中使用 C 库,并希望发送 C 库要求的类型。

C 字符串不存储自己的长度,所以用一个'null terminator'(字符[=10=])来标记字符串的结束。这会向字符串中添加一个额外的字节。由于您是从字符串文字初始化的,因此它会忽略 [32] 并使用实际字符串的长度,其中包括隐藏的终止符。

如果您只处理字符、符号和数字,则无需使用 unsigned char [],因为所有这些数据都在一个简单的 char 范围内(它基本上是 2 的 8 位数据类型补充)。

其次,如果你想快速初始化一个char[],你可以使用库string.h,这是一个标准且非常有用的库,只需包含它即可。然后只需将您的字符串复制到变量中,考虑到您必须将 space 保留为隐式放置在字符串 (char []) 中的结束字符 '\0',以便库 string.h 可以检测到结束一个字符串 (char[]).

char blind[33];
strcpy(blind,"and my kingdom too for a blinder");
printf("%s", blind);

输出:我的王国也是瞎眼的

问题"and my kingdom too for a blinder"字符串文字类型const char[33]而不是const char[32].最后一个字符是空字符'[=15=]'。这意味着字符串文字 "and my kingdom too for a blinder" 等同于:

{'a', 'n', 'd', ' ', 'm', 'y', ' ', 'k','i','n','g','d','o','m',' ','t','o','o',' ','f','o', 'r', ' ', 'a', ' ', 'b', 'l', 'i', 'n', 'd', 'e', 'r', '[=10=]'}

注意上面的 const char 等效数组有 33 个字符,包括空字符 '[=15=]'.

为了解决这只是改变目标数组的大小,如下所示:

//---------vv------------------------------------------->changed to 33
char blind[33] = "and my kingdom too for a blinder";