动态内存函数之malloc free calloc realloc

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函数的概念、使用方法以及使用时应注意的问题!


猜你喜欢

转载自blog.csdn.net/tongxuexie/article/details/80259279