【问题标题】:Does '\0' Take Up The Size of a Char? - C'\0' 是否占用字符的大小? - C
【发布时间】:2020-09-07 23:14:38
【问题描述】:

所以我正在创建一个字符到字符串的转换器,并且我正在使用malloc 创建一个字符串。我知道我需要为空终止字符\0 腾出空间。我也这样做char *example = malloc(sizeof(char) + 1);(即\0占用1个字节)或char *example = malloc(2 * sizeof(char));(即\0占用一个字符的大小)。那么\0 占用了多少空间呢?

编辑:我才意识到是一样的,谢谢大家!

【问题讨论】:

  • 这些是等价的,因为sizeof(char) == 1(总是)。
  • 另外,空终止符一个字符。
  • (不要这样做sizeof('\0'),因为奇怪的是,字符文字不是字符。)
  • '\0' 是一个字符常量。它的类型为int,大小为sizeof(int)char ch = '\0'; 将值 0 分配给 chch 的大小为 sizeof(ch) 或 1。
  • 我知道这个问题被标记为“C”,但只是为了避免有人在 C++ 中被抛弃,在 C++ 中 sizeof('\0') ==1(与 C 不同)。

标签: c null-terminated


【解决方案1】:

只是为了强调 cmets 中指出的内容:

[does] '\0' 占用 1 个字节 [或是否] 占用 char 的大小

它们是一回事,因为char根据定义是一个字节。无论您的 C 实现是什么,sizeof(char) == 1 始终为真。

编写malloc 调用的惯用方式是

malloc(1 + 1);  /* one character, + terminating NUL */

您唯一应该在代码中写入sizeof(char) 的情况是,如果您需要强制表达式具有size_t 类型,但由于某些奇怪的原因您不能包含stddef.h

(虽然不太可能,但char 可能大于一个八位字节——也就是说,它包含多于八位。例如,一个 C 实现PDP-10 可能会使 char 包含 9 位,并且在面向字的处理器中,char 必须是 16 位或 32 位。在这样的实现中,sizeof(char) 仍然 1,而char仍被认为与“字节”相同,但宏CHAR_BIT(在limits.h中定义)的值将大于8。

char不可能包含少于八位,因为char 需要能够表示数字范围 -127 ≤ x ≤ +127,不适合七位。)

【讨论】:

  • 绝对 sizeof(char) 是 C 中测量对象大小的单位,可以超过 8 位。然而,将其作为“字节”的定义更具争议性。也许这曾经被广泛接受,但我敢说,如今,大部分计算世界都将“字节”视为“八位字节”的同义词。 +1 都一样。
  • @JohnBollinger 事实上,现在很多人认为“字节”是“八位字节”的同义词,但我给出的定义是 C 标准中使用的定义。参见 §3.6 和 3.7。
【解决方案2】:

'\0' 占用一个字节的空间。你可能想malloc(length_of_string + 1)

所以对于"abc",您将分配总共 4 个字节。

【讨论】:

  • 谢谢!烦人的 11 分钟计时器到时,我会接受这个问题
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 2014-03-15
  • 2015-09-04
  • 2015-07-13
  • 2019-05-23
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多