如何在 C 中使用 realloc

How to use realloc in C

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

char string[] =  "fun";

如果我尝试添加更多 space,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 函数仅适用于最初由一小组分配函数创建的事物(例如 malloccallocrealloc 本身) ,或空指针。由于 string 是那些东西的 none,您的代码定义不明确。

would the realloc function work if I try to add more space?

不,因为该数组未在堆上分配 - 在您的情况下,它很可能分配在堆栈上并且无法调整大小。简单地说:realloc 无法识别指针,也不知道如何处理它,但无论如何都会尝试做某事,因此崩溃。

您只能对先前传递给 malloc 的指针或空指针调用 realloc。这就是这些功能的工作原理。

详情见What gets allocated on the stack and the heap?

I saw that you need to use malloc before but I don't understand if you MUST use it

如果您需要先使用malloc才能realloc某些东西,那么根据定义您必须只有 realloc 最初分配给 malloc 的东西。

您正试图在“需要”和“必须”之间找到不存在的space。

... for some reason the program crushes on the 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

... must be previously allocated by malloc(), calloc() or realloc() and not yet freed with a call to free or realloc

[OR] If ptr is NULL, the behavior is the same as calling malloc(new_size).