使用 malloc 分配空间时,是否包含空字符?

9

我已经使用 C 语言很长一段时间了,现在我有个小问题需要查询。

比如说我想创建一个字符数组来存储最多 1000 个字符。那么,当我使用 malloc 来实现时,我应该将数组的大小设为 1001 个字符(1000 个字符 + 1 个 null),还是只设为 1000 个字符呢?

另外,如果我遇到这个问题,我该怎么自己找到答案呢?也许可以通过编写一些测试程序来解决。虽然我们知道,在计算字符串长度时不包括 null 字符,但是在为字符串分配内存时,是否应该考虑 null 字符呢?

4个回答

10
如果您需要用于存储以空字符结尾的字符串的块,则需要显式要求malloc()分配多一个字节来存储空字符,否则malloc()不会为您分配。如果您打算在其他地方存储字符串长度,因此不需要空字符,则可以不分配额外的字节。当然,您是否需要对字符串进行空终止取决于您自己,只是不要忘记C库字符串处理函数仅适用于以空字符结尾的字符串。

4
malloc及其相关函数按字节分配内存。因此,如果您使用malloc(1000),则会获得1000个字节的内存。malloc不会关心您是否将这1000个字节分配给字符串或其他任何数据类型。
由于C中的字符串每个字符由一个字节组成,并且理想情况下必须以null结尾,因此您需要确保有足够的内存来容纳它。因此,答案是:如果您希望容纳1000个字符加上空终止符的字符串,则需要分配1001个字节。
高级技巧:还要记住,根据您的使用方式,可能需要或不需要使用空终止符来表示字符串。
例如,如果您知道字符串的确切长度,则可以在使用printf时指定该长度。
printf("%*s", length, string);

将会准确地从指向 string 的缓冲区中打印出 length 个字符。


2

由您提供空字符是必要的。

malloc 为您分配内存,但它不会将其设置为任何值。

如果您对分配的内存使用strcpy,则会为您提供一个空终止符。

或者,使用calloc,它会将所有元素设置为0,这实际上就是空终止符。然后如果您执行memcpy等操作,就不必担心正确终止字符串。


4
请注意,空字符需要额外的一个字节,因此如果您的字符串需要一千个字符长度,使用calloc()函数并不能改变您需要一千零一个字节来存储字符串的事实。 - This isn't my real name

1
你确实需要为空终止符分配内存。
从概念上讲,空终止符只是标记字符串结尾的一种方便方式。C标准库在模拟字符串时利用了这个约定。例如,strlen通过检查从输入位置(可能是char*)开始的内存直到达到空终止符来计算字符串的长度;但是空终止符本身不包含在长度中。但它仍然是字符串消耗的内存的一部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接