如何在C中使用realloc

  • 本文关键字:realloc c realloc
  • 更新时间 :
  • 英文 :


我正在尝试使用realloc函数重新分配内存,我之前看到你需要使用malloc,但我不明白你是否必须使用它,因为假设我正在创建以下字符串:

char string[] =  "fun";

如果我尝试添加更多空间,realloc函数会起作用吗?

这就引出了我的问题,我试图简单地在字符串的末尾添加一个字母,比如说"p",但由于某种原因,每次运行该程序时,它都会在realloc行上崩溃。

这是我的完整代码:

int main()
{
char string[] =  "fun" ;
str_func(string);
printf("%s", string);
return 0;
} 
void str_func(char* str)
{
str = (char*)realloc(str, strlen(str) + 2);
strcat(str, "p");
}

我还尝试制作一个指向"string"的指针并发送指针,结果也是一样的。

如果我尝试添加更多空间,realloc函数会起作用吗?

否,因为该数组没有在堆上分配-在您的情况下,它很可能是在堆栈上分配的,无法调整大小。简单地说:realloc不识别指针,也不知道该怎么处理它,但无论如何都会尝试做一些事情,从而导致崩溃。

只能对以前传递给malloc的指针或空指针调用realloc。这就是这些功能的工作方式。

有关详细信息,请参阅在堆栈和堆上分配了什么?。

我以前看到你需要使用malloc,但我不明白你是否必须使用它

如果需要使用malloc才能使用realloc内容,则根据定义,必须仅使用最初分配给mallocrealloc内容。

你试图在";需要";以及";必须";那根本不存在。

。。。由于某种原因,该程序在realloc 上崩溃

您已经说过您需要使用malloc。然后你没有使用malloc,你会问为什么这是一个问题。你至少可以尝试做你所说的事情;知道";你需要做,看看这是否能解决问题。

该程序可能看起来像

int main()
{
/* array is an automatic local variable. It wasn't dynamically allocated
in the first place, so can't be dynamically re-allocated either.
You cannot (and don't need to) free it either, it just goes out of scope
like any other automatic variable.
*/
char array[] = "fun";
/* you need to use malloc (or one of the other dynamic allocation functions)
before you can realloc, as you said yourself */
char *dynamic = malloc(1+strlen(array));
memcpy(dynamic, array, 1+strlen(array));
/* realloc can move your data, so you must use the returned address */
dynamic = str_func(dynamic);
printf("old:'%s', new:'%s'n", array, dynamic);
/* not really essential since the program is about to exit anyway */
free(dynamic);
} 
char* str_func(char* str)
{
char* newstr = realloc(str, strlen(str) + 2);
if (newstr) {
strcat(newstr, "p");
return newstr;
} else {
/* we failed to make str larger, but it is still there and should be freed */
return str;
}
}

您的原始条件不太正确:实际上指针传递到realloc

。。。必须先前由malloc()calloc()realloc()分配,并且尚未通过调用free或realloc 来释放

[OR]如果ptr为NULL,则行为与调用malloc(new_size)相同。

realloc函数仅适用于最初使用一小群分配函数(如malloccallocrealloc本身(或空指针创建的对象。由于string不是这些东西,所以您的代码没有定义好。

相关内容

  • 没有找到相关文章

最新更新