繁体   English   中英

“NUL”字符(“\0”)字节是分隔的还是分配给带有字符串的字符数组?

[英]Is the “NUL” character (“\0”) byte separated or is it assigned to that char-array with the string?

如果我定义一个字符串:

   char array[5] = {"hello"};

是否将 NUL 字符 (\0) 字节“隐藏”添加到“array[5]”中,使得 memory 中的数组不包含 5 个字节,而是包含 6 个字节?

或者 NUL 字符字节是否与 memory 中的“array[5]”“分开”仅在 char 数组的最后一个元素之后,但不直接分配给“array[5]”?

如果我会这样说:

  i = strlen(array);
  printf("The Amount of bytes preserved for array: %d",i);

为数组 [5] 保留的字节数会是什么结果?

“NUL”字符(“\0”)字节是否位于 memory 中 char 数组的最后一个元素之后分隔,还是分配给该 char 数组?

“NUL”字符(“\0”)字节是否位于 memory 中 char 数组的最后一个元素之后分隔,还是分配给该 char 数组?

不,两个答案都不正确。 详情见下文。


C 的答案:

如果您这样编写代码,并且显式大小对于终止符来说太小,则array将恰好有 5 个元素,并且不会有 NUL 字符。

strlen(array)具有未定义的行为,因为array不是字符串(它没有终止符)。 char array[5] = {"hello"}; 相当于char array[5] = {'h', 'e', 'l', 'l', 'o'}; .

另一方面,如果你写

char array[] = "hello";

它相当于

char array[6] = {'h', 'e', 'l', 'l', 'o', '\0'};

strlen将报告5

C标准的相关部分是:

字符类型的数组可以由字符串字面量初始化,可选地用大括号括起来。 字符串文字的连续字符(包括终止 null 字符,如果有空间或如果数组大小未知)初始化数组的元素。

(强调我的。)


C++ 的答案:

您的代码无效。 [dcl.init.string]状态:

初始化器的个数不得多于数组元素的个数。 [示例:

 char cv[4] = "asdf"; // error

格式不正确,因为隐含的尾随'\0'没有空间。 结束示例]

在 C++ 中, char array[5] = {"hello"}为 6 个字节。 但是您只分配了五个字节。 因此,数组声明不正确。

或者,这可行: char array[6] = {"hello"}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM