跳到主要内容

C++ realloc() 函数

realloc() 函数用于重新分配之前使用 malloc()calloc() 或 realloc() 函数分配的内存,且尚未使用 free() 函数释放。

如果新大小为零,返回的值取决于库的实现。它可能返回也可能不返回空指针。

realloc() 函数原型

void* realloc(void* ptr, size_t new_size);

该函数定义在 <cstdlib> 头文件中。

realloc() 参数

  • ptr:指向要重新分配的内存块的指针。
  • new_size:表示内存块新大小(以字节为单位)的无符号整数值。

realloc() 返回值

realloc() 函数返回:

  • 指向重新分配的内存块开始处的指针。
  • 如果分配失败,则返回空指针。

在重新分配内存时,如果没有足够的内存,则旧的内存块不会被释放,并返回空指针。

如果旧指针(即 ptr)为 null,调用 realloc() 与使用新大小作为其参数调用 malloc() 函数相同。

重新分配内存有两种可能的方式:

  1. 扩展或收缩同一块内存:如果可能,由旧指针(即 ptr)指向的内存块被扩展或收缩。内存块的内容保持不变,直到新旧大小中较小的一个。如果区域被扩展,新分配的块的内容未定义。
  2. 移动到新位置:分配大小为 new_size 字节的新内存块。在这种情况下,内存块的内容也保持不变,直到新旧大小中较小的一个,如果内存被扩展,新分配的块的内容未定义。

示例 1:realloc() 函数如何工作?

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
float *ptr, *new_ptr;
ptr = (float*) malloc(5*sizeof(float));
if(ptr==NULL)
{
cout << "内存分配失败";
exit(1);
}

/* 初始化内存块 */
for (int i=0; i<5; i++)
{
ptr[i] = i*1.5;
}

/* 重新分配内存 */
new_ptr = (float*) realloc(ptr, 10*sizeof(float));
if(new_ptr==NULL)
{
cout << "内存重新分配失败";
exit(1);
}

/* 初始化重新分配的内存块 */
for (int i=5; i<10; i++)
{
new_ptr[i] = i*2.5;
}
cout << "打印值" << endl;

for (int i=0; i<10; i++)
{
cout << new_ptr[i] << endl;
}
free(new_ptr);

return 0;
}

当你运行程序时,输出将是:

打印值
0
1.5
3
4.5
6
12.5
15
17.5
20
22.5

示例 2:realloc() 函数新大小为零时

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
int *ptr, *new_ptr;
ptr = (int*) malloc(5*sizeof(int));

if(ptr==NULL)
{
cout << "内存分配失败";
exit(1);
}

/* 初始化内存块 */
for (int i=0; i<5; i++)
{
ptr[i] = i;
}

/* 重新分配大小为 0 的内存 */
new_ptr = (int*) realloc(ptr, 0);
if(new_ptr==NULL)
{
cout << "空指针";
}
else
{
cout << "非空指针";
}

return 0;
}

当你运行程序时,输出将是:

空指针

示例 3:ptr 为 NULL 时 realloc() 函数

的表现

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

int main()
{
char *ptr=NULL, *new_ptr;

/* 重新分配内存,相当于 malloc(20*sizeof(char)) */
new_ptr = (char*) realloc(ptr, 50*sizeof(char));
strcpy(new_ptr, "欢迎访问 Programiz.com");
cout << new_ptr;

free(new_ptr);
return 0;
}

当你运行程序时,输出将是:

欢迎访问 Programiz.com