更大字符串的 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() 安全 [重复]

为啥使用 realloc() 时会出现双重释放或损坏错误?

为啥在使用 realloc() 进行动态内存分配之后再添加一块内存?

C 编程 - realloc 应该多久使用一次?

realloc() 导致程序停止