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