首页 > 解决方案 > “NUL”字符(“\0”)字节是分开的还是用字符串分配给那个字符数组?

问题描述

如果我定义一个字符串:

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

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

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

如果我会这样说:

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

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

“NUL”字符(“\0”)字节是在内存中字符数组的最后一个元素之后分开还是分配给该字符数组?

标签: c++cstringmemorynull

解决方案


“NUL”字符(“\0”)字节是在内存中字符数组的最后一个元素之后分开还是分配给该字符数组?

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


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标准的相关部分是:

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

(强调我的。)


C++ 的答案:

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

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

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

是格式错误的,因为没有用于隐含尾随的空间'\0'. —结束示例]


推荐阅读