可以使用 realloc() 更改动态分配的内存大小。
根据 C99 标准:
realloc 释放 ptr 指向的旧对象并返回一个指向具有 size 指定大小的新对象的指针。新对象的内容与释放前旧对象的内容相同,直至新旧大小中的较小者。新对象中超出旧对象大小的任何字节都具有不确定的值。
需要注意的一点是realloc() 应该只用于动态分配的内存。如果内存不是动态分配的,那么行为是未定义的。
例如,程序 1 演示了 realloc() 的不正确使用,程序 2 演示了 realloc() 的正确使用。
方案一:
输出:
未定义的行为
方案二:
输出:
10 20 30
void *realloc(void *ptr, size_t size);
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[2], i;
int *ptr = arr;
int *ptr_new;
arr[0] = 10;
arr[1] = 20;
// incorrect use of new_ptr: undefined behaviour
ptr_new = (int *)realloc(ptr, sizeof(int)*3);
*(ptr_new + 2) = 30;
for(i = 0; i < 3; i++)
printf("%d ", *(ptr_new + i));
getchar();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr = (int *)malloc(sizeof(int)*2);
int i;
int *ptr_new;
*ptr = 10;
*(ptr + 1) = 20;
ptr_new = (int *)realloc(ptr, sizeof(int)*3);
*(ptr_new + 2) = 30;
for(i = 0; i < 3; i++)
printf("%d ", *(ptr_new + i));
getchar();
return 0;
}