realloc和free
时间: 2024-09-04 13:00:23 浏览: 37
realloc和free是C语言中用于动态内存管理的两个标准库函数,它们定义在<stdlib.h>头文件中。
1. realloc:该函数用于重新分配以前通过malloc、calloc或realloc获得的内存块的大小。如果重新分配成功,函数返回指向新分配内存的指针,该内存块的初始内容与旧内存块相同。如果重新分配失败(例如,没有足够的可用内存),则返回NULL,并且原始内存块的大小不会改变。
函数原型如下:
```
void* realloc(void *ptr, size_t size);
```
其中ptr是要调整大小的内存块的原始指针,size是新内存块的大小(字节)。
2. free:该函数用于释放之前通过动态内存分配函数(如malloc、calloc、realloc)获得的内存块。使用free释放内存后,该内存块应该被视为未分配,对它的访问可能会导致未定义的行为。
函数原型如下:
```
void free(void *ptr);
```
其中ptr是指向要释放的内存块的指针。
在使用这两个函数时,需要注意:
- 传递给realloc的指针必须是之前通过动态内存分配函数获得的,且未使用free释放的指针。
- 使用free释放内存后,应当将指针设置为NULL,以避免悬挂指针的问题。
- 动态分配的内存块应该尽量匹配其使用需求的大小,避免频繁地使用realloc进行大小调整,因为这可能影响程序性能。
- 应该确保每个通过动态内存分配获得的内存块最终都被free释放,以避免内存泄漏。
相关问题
c 语言 malloc calloc realloc free 解释
在C语言中,动态内存分配与释放是非常常见的操作。C语言提供了四个函数来实现动态内存分配与释放,分别是malloc、calloc、realloc和free。
1. malloc函数
malloc函数用于在内存堆中分配一块指定大小的内存空间,并返回其首地址。其基本语法如下:
```c
#include <stdlib.h>
void* malloc(size_t size);
```
其中,size_t是一个无符号整型类型,用于表示需要分配的内存空间大小(以字节为单位)。malloc函数返回一个void类型的指针,指向分配的内存空间的首地址。如果分配失败,则返回NULL。
例如,以下代码用于在内存堆中分配10个int类型的数组空间:
```c
int *p = (int *) malloc(10 * sizeof(int));
```
2. calloc函数
calloc函数用于在内存堆中分配一块指定大小的内存空间,并将其清零,然后返回其首地址。其基本语法如下:
```c
#include <stdlib.h>
void* calloc(size_t num, size_t size);
```
其中,num和size都是size_t类型的整数,用于表示需要分配的内存空间大小(以字节为单位)。calloc函数返回一个void类型的指针,指向分配的内存空间的首地址。如果分配失败,则返回NULL。
例如,以下代码用于在内存堆中分配10个int类型的数组空间,并将其清零:
```c
int *p = (int *) calloc(10, sizeof(int));
```
3. realloc函数
realloc函数用于重新调整已经分配的内存空间的大小,可以扩大或缩小内存空间。其基本语法如下:
```c
#include <stdlib.h>
void* realloc(void* ptr, size_t size);
```
其中,ptr是需要重新调整大小的内存空间的首地址,size是需要调整的大小(以字节为单位)。realloc函数返回一个void类型的指针,指向调整后的内存空间的首地址。如果调整失败,则返回NULL。
例如,以下代码用于将之前分配的10个int类型的数组空间扩大为20个int类型的数组空间:
```c
int *p = (int *) malloc(10 * sizeof(int));
p = (int *) realloc(p, 20 * sizeof(int));
```
4. free函数
free函数用于释放之前分配的内存空间,将其归还给内存堆。其基本语法如下:
```c
#include <stdlib.h>
void free(void* ptr);
```
其中,ptr是需要释放的内存空间的首地址。调用free函数后,该内存空间将不再可用,程序不能再访问该内存空间中的数据。
例如,以下代码用于释放之前分配的10个int类型的数组空间:
```c
int *p = (int *) malloc(10 * sizeof(int));
free(p);
```
需要注意的是,为了避免内存泄漏和野指针问题,程序员需要谨慎使用动态内存分配与释放,尽量避免不必要的内存分配和释放。同时,为了确保程序的稳定性和可靠性,程序员需要在使用动态内存分配时,充分考虑内存分配失败的情况,并做好错误处理。
realloc
`realloc` 函数是 C 语言标准库中的一种内存管理函数,用于修改已经分配的内存块的大小。其原型为:
```c
void *realloc(void *ptr, size_t size);
```
参数 `ptr` 是之前通过 `malloc`、`calloc` 或 `realloc` 分配的内存块的指针,参数 `size` 是需要重新分配的内存块的大小。如果成功,`realloc` 函数返回指向重新分配后的内存块的指针。如果失败,`realloc` 函数返回 `NULL`。
`realloc` 函数会尝试扩大或缩小内存块的大小,具体操作如下:
1. 如果 `ptr` 为 `NULL`,则等同于调用 `malloc(size)`,即分配 `size` 字节的内存块并返回指向该块内存的指针。
2. 如果 `size` 为 `0`,则等同于调用 `free(ptr)`,即释放 `ptr` 所指向的内存块,并返回 `NULL`。
3. 如果 `ptr` 不为 `NULL`,且 `size` 不为 `0`,则会尝试重新分配 `ptr` 所指向的内存块。
1. 如果重新分配后的内存块与原内存块的大小相同或更大,则直接返回 `ptr`。
2. 如果重新分配后的内存块比原内存块更小,则会截取原内存块中前面的一部分作为新的内存块,并将余下部分仍留在原内存块中。返回指向新的内存块的指针。
3. 如果重新分配后的内存块比原内存块更大,则会尝试扩大原内存块,如果原内存块所在的连续空闲内存块足够大,则直接扩大原内存块。否则,会重新分配一块更大的内存块,并将原内存块中的内容拷贝到新的内存块中。返回指向新的内存块的指针。
需要注意的是,`realloc` 函数可能会改变原先内存块的地址,因此必须将返回的指针重新赋值给原指针变量,如下面的示例所示:
```c
int *p = malloc(10 * sizeof(int)); //分配 10 个 int 类型大小的内存块
p = realloc(p, 20 * sizeof(int)); //重新分配内存块大小为 20 个 int 类型
if (p == NULL) {
//重新分配失败,处理错误
}
//重新分配成功,使用 p 指向的内存块
```
阅读全文