1. malloc()函数
void *malloc( size_t size );
(1)malloc函数是向内存申请一块连续可用的大小为size的内存空间并且返回指向这块空间的指针。
(2)若开辟成功,则返回指向开辟好的空间的指针。
(3)若开辟失败,则返回空指针NULL。
(4)返回值类型时void*,故malloc函数并不知道开辟空间的类型,具体类型在使用时由使用者决定。
(5)若参数size为0时,malloc函数的行为标准是未定义的,这取决于编译器。
(6)调用malloc函数后,需要对malloc函数的返回值做检查,以防开辟失败从而访问非法内存空间。
下面使用malloc函数:
#define _CRT_SECURE_NO_WARNINGS 1
#include<Windows.h>
#include<stdio.h>
int main()
{
int num = 3;
int* ptr;
ptr = (int*)malloc(sizeof(int)*num);
if (ptr != NULL)
{
int i = 0;
for (i = 0; i < num; i++)
{
ptr[i] = i;
printf("%d ", ptr[i]);
}
}
printf("\n");
system("pause");
return 0;
}
此时,使用malloc函数动态申请了大小为num*sizeof(int)个字节的内存空间,返回指向所申请的内存空间的指针。但要注意,万一申请失败而在其后使用该内存就会使程序奔溃!所以一般对malloc函数的返回值要做检查,当返回值不是NULL时才使用。
2. free()函数
void free( void *memblock );
(1)free()函数作用是释放动态申请的内存空间。
(2)free()函数的参数表示动态申请内存的指针。
下面使用free()函数:
#define _CRT_SECURE_NO_WARNINGS 1
#include<Windows.h>
#include<stdio.h>
int main()
{
int num = 3;
int* ptr;
ptr = (int*)malloc(sizeof(int)*num);
if (ptr != NULL)
{
int i = 0;
for (i = 0; i < num; i++)
{
ptr[i] = i;
printf("%d ", ptr[i]);
}
}
printf("\n");
//调用free()函数
free(ptr);
system("pause");
return 0;
}
此时,调用free函数后释放了ptr所指向的动态申请的内存,但需要注意以下几点:
(1)内存在动态申请释放时必须整体申请,整体释放。
(2)内存申请一次,只能释放一次。
(3)一旦释放了动态申请的内存空间,则不能使用。
(4)基于free后不能使用,故建议在释放后将指针置为NULL。
3. calloc()函数
void *calloc( size_t num, size_t size );
其实,calloc函数和malloc函数的用法基本类似,均是用于动态申请内存空间。
(1)calloc函数的功能是开辟num个大小为size的内存空间,故共开辟了num*size个字节的内存空间。
(2)calloc函数与malloc函数的唯一区别就是calloc函数将开辟的空间的每个字节初始化为0。
下面使用calloc函数:
#define _CRT_SECURE_NO_WARNINGS 1
#include<Windows.h>
#include<stdio.h>
int main()
{
int num = 3;
int* ptr1 = (int*)calloc(num,sizeof(int));
int* ptr2 = (int*)malloc(num*sizeof(int));
//打印calloc函数申请的内存的内容
if (ptr1 != NULL)
{
int i = 0;
for (i = 0; i < num; i++)
{
printf("%d ", ptr1[i]);
}
}
printf("\n");
//打印malloc函数申请的内存的内容
if (ptr2 != NULL)
{
int i = 0;
for (i = 0; i < num; i++)
{
printf("%d ", ptr2[i]);
}
}
printf("\n");
//调用free()函数
free(ptr1);
free(ptr2);
system("pause");
return 0;
}
运行结果:
0 0 0
-842151451 -842151451 -842151451
故:calloc函数申请的内存存放的是0,而malloc函数申请的内存存放的是随机数!
4. realloc()函数
void *realloc( void *memblock, size_t size );
realloc函数的出现让动态内存更加地灵活,即使我们动态申请了内存,但发现有时候申请的内存太小了,有时候申请的内存太大了,这时候为了更加合理的使用内存,需要对 内存的大小作出一定调整。realloc函数就可以实现调整动态开辟的内存大小的操作。
(1)参数memblock是要调整的动态申请的内存的指针。
(2)参数size表示需要调整的大小。
(3)返回值为调整之后,指向动态申请的内存的指针。
(4)需要注意的是realloc函数在调整内存时存在以下两种情况:1.原有内存之后有足够空间可以向上扩展 2.原有内存之后没有足够的空间扩展,则需要在堆上重新开辟空间并将数据拷贝以及释放原有空间。故realloc函数返回值有可能和原来相同有可能不同。
下面使用realloc函数:
#define _CRT_SECURE_NO_WARNINGS 1
#include<Windows.h>
#include<stdio.h>
int main()
{
int num = 3;
int* ptr1= (int*)malloc(num*sizeof(int));
//将动态申请的内存调小
int* ptr2 = realloc(ptr1, sizeof(int));
if (ptr2 != NULL)
{
ptr1 = ptr2;
*ptr1 = 10;
printf("%d\n", *ptr1);
}
printf("\n");
//使用完毕,释放动态申请的内存空间
free(ptr1);
system("pause");
return 0;
}
以上就是简单地介绍malloc函数、free函数、calloc函数、realloc函数的概念、使用方法以及使用时应注意的问题!