零.导言
上一篇文章我介绍了 malloc 和 free 函数的使用,让大家对动态内存有了初步的认识。今天就让我来介绍和 malloc 关系密切的 calloc 和 realloc ,它们的用法和 malloc 差不多。
一.calloc
先说重点:!!!calloc 与 malloc 不同的是, calloc 动态申请空间后,会将数组的每个元素初始化为0 !!!因此使用 calloc 动态申请数组后不需要进行初始化的操作。
接下来我们看一下calloc的用法:
int capacity = 10;
int* arr = (int*)calloc(capacity, sizeof(int));
if(arr == NULL)
{
perror("malloc fail!");
exit(1);
}
与 malloc 不同的是, calloc 有两个参数:第一个参数是你所申请的数组的元素个数,第二个参数是你所申请的数组的单个元素占用空间的大小,其他要点与 malloc 一致。
二.realloc
相较于 calloc ,realloc 的使用较为复杂,realloc 的作用是重新分配动态内存空间的大小,也是进行动态内存管理的关键。使用方法如下:
typedef struct SeqList
{
int* arr;
int size;
int capacity;
}SeqList;
void SLPushBack(SeqList* ps, int x)
{
if(ps->size == ps->capacity)
{
int NewCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
int* tmp = (int*)realloc(ps->arr, sizeof(int) * NewCapacity);
if(tmp == NULL)
{
perror("realloc fail!");
exit(1);
}
ps->arr = tmp;
}
ps->arr[ps->size++] = x;
ps->capacity = NewCapacity;
}
例如我在这里定义了一个结构体:顺序表,在顺序表中我动态建立了一个数组,当我需要在这个数组中插入元素时,如果判断数组空间大小不够,则使用 realloc 重新分配数组的空间大小,realloc 有两个参数,第一个参数为原数组的地址,第二个参数为需要重新分配的空间大小。
其他要点与 malloc 相同。
三.realloc的注意事项
需要注意的是,当 realloc 动态分配内存失败时,不会改变元素组的内容与大小,并且返回NULL;
四.相关链接
完
2万+

被折叠的 条评论
为什么被折叠?



