我使用 C 已经有一段时间了,我有一个我想查询的小问题。
假设我想创建一个最多可存储 1000 个字符的字符数组。现在,当我使用 malloc 时,我是将数组的大小指定为 1001 个字符 [1000 个字符 + null] 还是仅 1000 个?
另外,假设我遇到了这个问题,那么我怎么能自己找到这个解决方案的答案,也许是通过使用一些测试程序。我知道字符串的大小是在没有空字符的情况下计算的,但是当我为其分配内存时,我是否也考虑了空字符?
我使用 C 已经有一段时间了,我有一个我想查询的小问题。
假设我想创建一个最多可存储 1000 个字符的字符数组。现在,当我使用 malloc 时,我是将数组的大小指定为 1001 个字符 [1000 个字符 + null] 还是仅 1000 个?
另外,假设我遇到了这个问题,那么我怎么能自己找到这个解决方案的答案,也许是通过使用一些测试程序。我知道字符串的大小是在没有空字符的情况下计算的,但是当我为其分配内存时,我是否也考虑了空字符?
如果您需要该块来存储空终止字符串,那么是的,您需要明确要求malloc()
分配一个额外的字节来存储空终止符,malloc()
否则不会为您执行此操作。如果您打算将字符串长度存储在其他地方,因此您不需要空终止符,您可以在不分配额外字节的情况下逃脱。当然,是否需要字符串的空终止取决于您,只是不要忘记 C 库字符串处理函数仅适用于空终止的字符串。
malloc
并且家庭以字节块的形式分配内存。所以如果你这样做,malloc(1000)
你会得到 1000 个字节。malloc
不会关心您是否分配了这 1000 个字节来保存字符串或任何其他数据类型。
由于 C 中的字符串由每个字符一个字节组成,并且理想情况下必须以 null 结尾,因此您需要确保有足够的内存来保存它。所以答案是:是的,如果你想保存一个 1000 个字符加上空终止符的字符串,你需要分配 1001 个字节。
高级提示:还请记住,根据您使用它的方式,您可能需要也可能不需要空终止字符串。
例如,如果您知道字符串的确切长度,则可以在使用它时指定printf
printf("%*s", length, string);
length
将从指向的缓冲区中精确打印字符string
。
由您决定是否提供空终止字符。
malloc
为您分配内存,但不会将其设置为任何内容。
如果您strcpy
使用分配的内存,那么您将为您提供一个空终止符。
或者,使用calloc
as 会将所有元素设置为 0,这实际上是空终止符。然后,如果你这样做,说,memcpy
你就不必担心正确终止字符串。
您确实需要为空终止符分配内存。
从概念上讲,空终止符只是标记字符串结尾的一种方便方式。C 标准库在对字符串建模时利用了这个约定。例如,strlen 通过从输入位置(可能是 char*)检查内存直到它到达一个空终止符来计算字符串的长度;但空终止符本身不包含在长度中。但它仍然是字符串消耗的内存的一部分。