c++ - “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”)字节是在内存中字符数组的最后一个元素之后分开还是分配给该字符数组?
解决方案
“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'
. —结束示例]
推荐阅读
- java - @OneToMany 惰性列表抛出 NPE
- apache-flink - Flink ProcessFunction onTimer 第一个事件 LONG.MIN_VALUE
- javascript - 如何安装 Svelte Material UI(使用 Routify)
- docker - 使用三星移动容器运行 Lippia 示例时出现错误
- python - Python中具有非常高维度的一对多时间序列相关性
- java - 如何从 .py 脚本执行 .class 文件(java)?
- python - 熊猫 iterrows 的替代品?
- jquery - jQuery checkbox.prop 无法触发 checkbox.on('change', function)
- excel - 如何获取 PivotTable 类的 PivotFields 属性?
- python - 如何使用 kivy 中的 id 更改图像