添加头
需要添加头信息
#include <stdlib.h>
malloc
C语言提供了一个动态内存开辟的函数,在stdlib.h 头文件中。函数原型如下:
void* malloc (size_t size);
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。size — 内存块的大小,以字节为单位,
此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。如果分配成功则返回指向被分配内存的指针),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
如果参数size 为0,malloc的行为是标准是未定义的,取决于编译器。
free
对应malloc,C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,在stdlib.h 头文件中。函数原型如下:
void free (void* ptr);
free函数用来释放动态开辟的内存。如果参数ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。如果参数ptr 是NULL指针,则函数什么事都不做。释放ptr后要将ptr及时指向NULL指针。
例子
void TEST1()
{
int num = 0;
scanf("%d",&num);
int* ptr = NULL;
ptr = (int*)malloc(num * sizeof(int));
if (ptr != NULL)
{
int i = 0;
for (i = 0; i < num; i++)
{
*(ptr + i) = 0;
}
}
free(ptr);
ptr = 0;
}
calloc
C语言还提供了一个函数叫calloc , calloc 函数也用来动态内存分配。malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。num — 要被分配的元素个数,size — 元素的大小,原型如下:
void* calloc (size_t num, size_t size);
函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0。与函数malloc 的区别只在于calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。
例子
void TEST2()
{
int* p = NULL;
p = (int*)calloc(10, sizeof(int));
if (p != NULL)
{
//使用空间
}
free(p);
p = 0;
}
realloc
重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。
应用场景:内存不够时,可通过该函数扩展、缩小内存
提示: 比 malloc()
+ memset()
函数 执行效率更高
void* realloc (void* ptr, size_t size);
例子
void TEST3()
{
int* p = NULL;
p = (int*)malloc(100);
if (p != NULL)
{
//使用空间
}
else
{
exit(EXIT_FAILURE);
}
int* ptr = NULL;
ptr = (int *)realloc(p,100);
if (ptr != NULL)
{
p = ptr; //指针要还给p
}
free(p);
p = NULL;
}