如何在 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
函数仅适用于最初由一小组分配函数创建的事物(例如 malloc
、calloc
或 realloc
本身) ,或空指针。由于 string
是那些东西的 none,您的代码定义不明确。
would the realloc function work if I try to add more space?
不,因为该数组未在堆上分配 - 在您的情况下,它很可能分配在堆栈上并且无法调整大小。简单地说:realloc
无法识别指针,也不知道如何处理它,但无论如何都会尝试做某事,因此崩溃。
您只能对先前传递给 malloc
的指针或空指针调用 realloc
。这就是这些功能的工作原理。
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)
.
我正在尝试使用 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
函数仅适用于最初由一小组分配函数创建的事物(例如 malloc
、calloc
或 realloc
本身) ,或空指针。由于 string
是那些东西的 none,您的代码定义不明确。
would the realloc function work if I try to add more space?
不,因为该数组未在堆上分配 - 在您的情况下,它很可能分配在堆栈上并且无法调整大小。简单地说:realloc
无法识别指针,也不知道如何处理它,但无论如何都会尝试做某事,因此崩溃。
您只能对先前传递给 malloc
的指针或空指针调用 realloc
。这就是这些功能的工作原理。
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()
orrealloc()
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)
.