c - malloc 分配字符串的确切大小
问题描述
如何使用 分配字符串的确切大小的最佳方法是malloc
?
我测试过
malloc((strlen(str) * sizeof(char));
当我尝试将相同的字符串复制到分配的区域时它不起作用,但以下工作:
malloc((strlen(str) + 10) * sizeof(char));
如果我尝试使用 +1 或 +10,它是否也能正常工作?为什么不能只是字符串长度?
还:
char str[100] = "string!";
malloc(sizeof(str));
这分配了多少内存?它会根据字符串数组的大小(100)还是长度(7)进行分配?
解决方案
\0
C 中的字符串需要以 NUL 结尾,即在字符串的最后一个字符之后总是有一个字符。所以类似"apple"
的长度为 5,但总共包含6 个字符,包括终止符。该strlen()
函数返回字符串的长度,即终止符之前的字符数,因此,如果要计算将字符串存储在内存中所需的实际最小大小,则需要将 1 返回的值加 1 strlen()
。
为字符串分配空间的正确方法是:
malloc(strlen(str) + 1);
顺便说一句,如果您想简单地复制一个字符串,该strdup()
函数会为您完成此操作,并且它比手动malloc
+ memcpy
/更易于使用strcpy
。
在char str[100] = "string!";
您定义的数组大小的情况下是100
. 前 7+1 个字符使用字符串文字的内容(7 个字符加上终止符)进行初始化,但该数组仍然是 100 个元素的数组。所以sizeof(str)
这里返回100
,malloc()
调用分配100
字节。
推荐阅读
- javascript - addeventlistener 直接在promise 下使用时不起作用,但在promise 下使用settimeout 可以正常工作
- python - Bing 壁纸捕手与 python
- pdf - fig 文件包含在函数 include_graphics() 中,当 rmd 转为 pdf/tex 时可能会丢失文件扩展名
- linux - 如何在我的配置命令中定义 _POSIX_VERSION?
- python - 我的 twitter 机器人、Github 和 Heroku 有问题:我无法在 heroku 中构建它
- c++ - C++ 和字符串文字的歧义处理
- c# - 使用 postSharp 如何在类级别捕获所有方法进入和退出事件?
- javascript - 在单击反应中的下拉列表时保持文本区域的焦点
- html - HTML 表单和输入数据
- javascript - 如何使用函数更改使用 JSON 的响应?