Malloc 分配字符串的确切大小

Malloc to allocate the exact size of a string

使用 malloc 分配字符串确切大小的最佳方法是什么?

我测试了

malloc((strlen(str) * sizeof(char));

当我试图将相同的字符串复制到分配的区域时它不起作用,但以下方法起作用了:

malloc((strlen(str) + 10) * sizeof(char));

如果我尝试使用 +1 而不是 +10,它是否也能正常工作?为什么不能只是字符串长度?

还有:

char str[100] = "string!";
malloc(sizeof(str));

这分配了多少内存?它会根据字符串数组的大小 (100) 或其长度 (7) 进行分配吗?

C 中的字符串需要以NUL 结尾,即在字符串的最后一个字符之后总是有一个[=11=] 字符。所以类似 "apple" 的长度为 5,但总共包含 6 个字符,包括终止符。 strlen() 函数 returns 字符串的长度,即终止符之前的字符数,因此如果要计算将字符串存储在内存中所需的实际最小大小,则需要添加1 到 strlen().

返回的值

为字符串分配 space 的正确方法是:

malloc(strlen(str) + 1);

顺便说一句,如果你想简单地复制一个字符串,strdup() 函数就是为你做的,而且它比手动 malloc + memcpy 使用起来更简单/strcpy.


char str[100] = "string!"; 的情况下,您定义的数组大小为 100。前 7+1 个字符用字符串文字的内容(7 个字符加上终止符)初始化,但数组仍然是一个 100 元素的数组。所以 sizeof(str) 这里 returns 100malloc() 调用分配 100 字节。

要知道字符串的结尾,必须有一个结束标记。即'[=11=]'。所以当你写 -

char str[100] = "string!";

这样保存的 -

所以你需要比 strlen(str) 多 1 个字符。 sizeof(str) 有效,因为它给出了您声明​​的 100 大小字符数组的大小。