重新分配内存
在为其分配内存后,可能需要扩展或缩小指针存储空间。void *realloc(void *ptr, size_t size)
函数释放 ptr
指向的旧对象,并返回指向 size
指定大小的对象的指针。ptr
是指向先前分配有要重新分配的 malloc
,calloc
或 realloc
(或空指针)的内存块的指针。保留原始内存的最大可能内容。如果新大小较大,则超出旧大小的任何其他内存都是未初始化的。如果新尺寸较短,则收缩部分的内容将丢失。如果 ptr
为 NULL,则分配一个新块,并由该函数返回指向它的指针。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p = malloc(10 * sizeof *p);
if (NULL == p)
{
perror("malloc() failed");
return EXIT_FAILURE;
}
p[0] = 42;
p[9] = 15;
/* Reallocate array to a larger size, storing the result into a
* temporary pointer in case realloc() fails. */
{
int *temporary = realloc(p, 1000000 * sizeof *temporary);
/* realloc() failed, the original allocation was not free'd yet. */
if (NULL == temporary)
{
perror("realloc() failed");
free(p); /* Clean up. */
return EXIT_FAILURE;
}
p = temporary;
}
/* From here on, array can be used with the new size it was
* realloc'ed to, until it is free'd. */
/* The values of p[0] to p[9] are preserved, so this will print:
42 15
*/
printf("%d %d\n", p[0], p[9]);
free(p);
return EXIT_SUCCESS;
}
重新分配的对象可能与*p
具有相同或不同的地址。因此,如果调用成功,从 realloc
捕获包含新地址的返回值非常重要。
确保将 realloc
的返回值分配给 temporary
而不是原始的 p
。如果发生任何故障,realloc
将返回 null,这将覆盖指针。这会丢失你的数据并造成内存泄漏。