realloc函数可以重用或扩展以前用malloc、calloc及realloc函数自身分配的内存。
realloc函数基本使用
函数原型
void* realloc(void* memblock, size_t size)
头文件为<stdlib.h>
参数需求
memblock是先前开辟的内存块的指针,size_t size指的是New size in bytes,新的字节数(不是增加的字节数,是新开辟的那块内存空间的字节数,返回值为调整之后的内存的起始地址);
函数返回值
realloc函数返回的是void*类型的指针,指向在堆区重新开辟的内存块的起始地址;
参考代码1【如何判断成功开辟一片动态内存】
#include <stdio.h>
#include <stdlib.h>
int main() {
// 定义指针并初始化为 NULL
void *ptr = NULL;
size_t size = 1024;
ptr = realloc(ptr, size);
if (ptr == NULL) {
printf("realloc 函数返回 NULL\n");
} else {
printf("realloc 函数返回非 NULL\n");
}
return 0;
}
【注】size_t类型通常用于表示数组、字符串、动态分配的内存块等的大小。与其他整数类型不同(如int、long等),size_t保证能够存储任意大小的正整数,因为它是无符号类型,没有符号位,从而可以避免整数溢出的问题。
参考代码2【使用该函数实现字符串输入输出】
#include <stdio.h>
#include <stdlib.h>
int main() {
// 初始分配的内存大小
int initialSize = 10;
// 实际分配的内存大小
int size = initialSize;
// 指向分配的内存的指针
char *str = NULL;
printf("请输入字符串:");
// 动态分配内存
str = (char *)realloc(str, size);
scanf("%s", str);
while (str[size - 1] != '\0') {
// 如果内存不足,重新分配更大的内存
size = size * 2;
str = (char *)realloc(str, size);
// 追加输入的字符
scanf("%c", &str[size - 1]);
}
// 输出字符串,并在末尾添加负一作为结束标志
printf("%s-%c", str, -1);
// 释放分配的内存
free(str);
return 0;
}
扩容&缩容
扩容
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = NULL;
int size = 4;
// 分配初始内存
arr = (int *)malloc(size * sizeof(int));
if (arr == NULL) {
printf("内存分配失败\n");
exit(1);
}
// 填充数组
for (int i = 0; i < size; i++) {
arr[i] = i;
}
// 检查是否需要扩容
if (size == 4) {
size *= 2;
// 重新分配内存并复制数据
arr = (int *)realloc(arr, size * sizeof(int));
if (arr == NULL) {
printf("内存重新分配失败\n");
exit(1);
}
}
// 输出扩容后的数组
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 释放内存
free(arr);
return 0;
}
缩容
引用一段我自己关注的博主的文章来给大家解释一下
如果我们realloc的新的内存块的大小<比之前动态内存malloc的大小,可不可以做到缩容来节省空间呢?
它有可能会原地缩容,也有可能会异地缩容。但我们一般不考虑缩容的问题,因为如果系统是异地缩容,它需要找一块空间,把原数据考虑过来,然后再把原空间释放,这样会有性能,时间上的代价。而且如果我们之后又要插入数据,那我们又要进行扩容。
总结一下来说:
缩容:以时间换空间
不缩容:以空间换时间
版权声明:本文为CSDN博主「_麦子熟了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_63449996/article/details/124363899