【C语言】calloc()、realloc()

时间:2022-12-27 17:17:00

????calloc()

calloc()函数的声明,如下所示↓

void* calloc (size_t num, size_t size);

为num元素数组分配一块内存,每个元素大小为字节长,并将其所有位初始化为零。有效的结果是分配一个(num*size)字节的零初始化内存块。

如果size为0,则返回值取决于特定的库实现(它可能是一个空指针,也可能不是),但返回的指针不应被解引用。 

  • 参数

num → 要分配的元素数量。

size →  每个元素的大小。

size_t →  是无符号整型。

  • 返回值

成功时,指向函数分配的内存块的指针。

该指针的类型始终是void*,可以将其转换为所需类型的数据指针,以便可解引用。

如果函数分配请求的内存块失败,则返回一个空指针。

calloc()函数和malloc()函数最大的区别无非就是:calloc()比malloc()就是参数多了一个,以及calloc()的函数会把每个字节进行初始化为全0,而malloc()不会对每个字节的内容进行初始化。calloc()会在返回地址之前把申请的空间的每个字节初始化全0的。

????calloc()动态内存开辟使用  

示例代码如下所示↓

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* p = (int*)calloc(10,sizeof(int));
if (p == NULL)
{
perror("main:");//perror() - 打印错误信息
}
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d\n", p[i]);//相当于数组打印元素
}
//回收内存空间
free(p);
p = NULL;
return 0;
}

【C语言】calloc()、realloc()

运行结果如下↓ 

0 0 0 0 0 0 0 0 0 0

从这里我们可以发现,calloc()函数是帮我们进行了初始化为0的。那么如果我们把这里的代码改成是malloc()函数的形式看下会怎么样,其它不变来康康运行结果。

int* p = (int*)malloc(10 * sizeof(int));

【C语言】calloc()、realloc()

-842150451 → ⑩行

从这里我们可以知道 malloc() 函数并没有帮我们进行初始化。


????realloc()

realloc()函数的声明,如下所示↓

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

【C语言】calloc()、realloc()

功能→改变由ptr指向的内存块的大小。 

  • 参数

ptr → 是要调整内存的地址。

size → 内存块的新大小,以字节为单位。调整之后新的大小。

size_t →  是无符号整型。

返回值→一个指向重新分配的内存块的指针,它可以与ptr相同,也可以是一个新位置。
该指针的类型为void*,可以将其转换为所需的数据指针类型,以便可解引用。

注意→如果ptr是一个空指针,该函数的行为类似于malloc(),分配一个大小为字节的新块,并返回指向其开头的指针。 如下代码所示↓

int* p = (int*)malloc(10 * sizeof(int));
int* p = (int*)realloc(NULL,10 * sizeof(int));

【C语言】calloc()、realloc()

实际上相当于等效。 

????realloc()动态内存开辟使用   

示例代码如下所示↓ 

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL)
{
perror("main:");//perror() - 打印错误信息
}
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
//这里需要p的指向空间更大,增加20个整形类型。realloc() - 调整空间
int* ptr = (int*)realloc(p, 20 * sizeof(int));
if (ptr != NULL)
{
p = ptr;
}
//回收内存空间
free(p);
p = NULL;
return 0;
}

【C语言】calloc()、realloc()

根据调试查看是否 realloc() 调整了 p 的内存空间。 


????内存开辟常见错误 

Ⅰ→ 对NULL指针的解引用操作。

Ⅱ → 对动态开辟空间的越界访问。

Ⅲ → 使用 free() 释放非动态开辟的空间。

Ⅳ → 使用 free() 释放动态内存中的一部份。

Ⅴ → 对同一块动态开辟的空间,用 free() 进行多次的释放。

Ⅵ → 动态开辟的空间忘记释放会导致内存的泄露,是比较严重的。