语法格式
1. `realloc`
函数用于动态地改变之前分配的内存块的大小。其函数原型如下:
void *realloc(void *ptr, size_t size);
- `ptr`: 指向之前分配的内存块的指针。如果 `ptr` 为 `NULL`,那么 `realloc` 行为与 `malloc` 相同。
- `size`: 新分配的大小(以字节为单位)。
`realloc` 可以调整内存块的大小,如果新的大小比原来小,那么内存块可能会被移动。如果新的大小比原来大,那么内存块会尝试扩展。如果扩展失败,那么原来的内存块会被保留,只是其大小变为新的大小。`realloc` 返回一个指向调整大小后的内存块的指针。如果调整大小失败,则返回 `NULL`。
在使用这些函数时,应当总是检查返回的指针是否为 `NULL`,以避免潜在的空指针引用错误。并且在使用 `calloc` 或 `realloc` 分配的内存后,应当在不再需要时使用 `free` 函数来释放内存,以避免内存泄露。
———————————————————————————————————————————
realloc函数的使用
这个函数的代码格式可以理解为 ,你之前malloc或者calloc申请的空间是p指针进行接收的,OK此时你想对这个空间进行空间的扩展,那此时的ptr也就是p指针变量,size也就是你需要的实际空间,这里的空间不是扩展的空间,而是实际的空间
void *realloc(void *ptr, size_t size);
也就是realloc(p,40)
之前我们p开辟的是20的空间 ,这里我们实际需要的是40的空间,这不是再开辟40空间,而是一共40 的空间。
下面解释一下为什么
———————————————————————————————————————————
realloc函数扩展空间的原理
realloc函数扩展空间几乎就是两种模式
1. 直接在原内存空间的基础上进行扩展内存
2. 把原空间的内存复制到新的内存空间,建立一个更大的内存空间,需要知道的是,只要是进行内存的复制,那么就有可能导致复制失败,从而导致数据丢失。
所以实际使用的时候,我们还是需要进行判断语句的。
如图1
如图2
———————————————————————————————————————————
realloc代码解析
首先我们创建一个空间 ,然后进行调整
因为这里使用的时候 是有可能导致开辟空间错误,导致地址的丢失,所以我们进行判断,也就是主动的找一个指针变量指向新开辟的地址,只要指向的空间不是空指针,那么也就是可以满足条件,然后进行一个二次赋值
最后,不使用的时候进行申请空间的清理,防止内存空间的泄露
———————————————————————————————————————————
realloc代码
int main()
{//malloc不初始化开辟空间//开辟20个字节的空间大小 int* p = (int*)calloc(5 , sizeof(int));if (p == NULL){perror("malloc:");//这里是打印错误信息,return 1;}for (int i = 0; i < 5; i++)//这里是打印出来开辟的空间 赋值之后进行打印 {//*(p + i) = i + 1;//这里是进行赋值 赋值从1开始printf("%d ", *(p + i));//这里是打印出来}free(p);//这里进行指针的释放p = NULL;//防止野指针的问题,我们指向空指针//首先我们已经开辟动态内存空间 但是不能满足我们的需求,那么此时我们就用realloc进行空间的扩展//依旧是采取强制类型转化,然后我们这里是延伸到40个字节的空间//因为我们知道,开辟空间的时候可能会导致内存空间的扩展失败//所以我们不能直接p=realloc(int*)realloc(p, 10 * sizeof(int)); //而是进行先搞一个新的指针变量,确定成功了,再进行赋值//也就是int* ptr = (int*)realloc(p, 10 * sizeof(int));if (ptr == NULL){perror("realloc:");//打印错误信息如果是空指针return 1;}p = ptr;for (int i = 0; i < 10; i++){*(p + i) = 0;printf("%d ", *(p + i));}free(p);p = NULL;return 0;
}
这里是15个0
因为calloc也打印5个0
不要误解