更大字符串的 realloc() 问题
Posted
技术标签:
【中文标题】更大字符串的 realloc() 问题【英文标题】:Issue with realloc() for bigger string 【发布时间】:2021-03-24 06:51:28 【问题描述】:我有以下 c 代码:
#include <stdio.h>
#include <stdlib.h>
int main()
char *str = malloc(5);
str = "abcd\0";
str = realloc(str, 9);
if(str == NULL)
printf("Not enough memory\n");
exit(EXIT_FAILURE);
str = "abcdabcd\0";
printf("%s\n", str);
main 方法的前两行工作正常,但是当我尝试重新分配内存时,它说 realloc() 是一个无效指针。我做错了什么?
顺便问一下:如果字符串值和分配的内存块一样大,是否需要设置一个NULL字符?
感谢您的帮助。
【问题讨论】:
str = "abcd\0";
并没有按照你的想法去做。
如果 9 个字节的 realloc()
失败,你就会遇到一些严重的问题。对于像这样的琐碎程序,不要费心检查NULL
。这是浪费时间。
【参考方案1】:
你的线路
str = "abcd\0";
没有将字符串复制到您 mallocd 的现有内存块;相反,它使指针 str
指向不同的位置(包含字符串常量的位置)。
相反,这样做:
strcpy(str, "abcd");
同样,当你以后更改字符串的内容时,你应该这样做:
strcpy(str, "abcdabcd");
请注意,您不需要明确指定空字符——它总是自动包含在字符串常量中。
顺便问一下:如果字符串值和分配的内存块一样大,是否需要设置一个NULL字符?
是的,字符串总是需要以空字符结尾。 C 没有任何方式“知道”内存块的结束位置。
【讨论】:
另一个修复:char *str = strdup("abcd")
制作一个可变的分配副本。
“可变”的意思是四个字符可以改,但不能改成五个字符串,所以如果打算改的话是非常危险的。
@gasher729 这就是realloc()
的用武之地。以上是关于更大字符串的 realloc() 问题的主要内容,如果未能解决你的问题,请参考以下文章
(void *) 的 realloc 中的内存泄漏以连接字符串
使用 realloc() 使 memmove() 安全 [重复]