malloc、calloc、realloc函数讲解

一、malloc

malloc() 函数用来动态地分配内存空间

其原型为:void* malloc (size_t size);

【参数说明】size 为需要分配的内存空间的大小,以字节(Byte)

【函数说明】malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。

【返回值】分配成功返回指向该内存的地址,失败则返回 NULL。

这里返回值,如果开辟的空间足够,就返回所开辟空间的地址,如果开辟失败(比如申请INT_MAX个字节的空间,就会开辟失败)

free

在每次动态申请内存空间之后,都需要对申请到的空间进行释放

不然的话会占用内存。(相当于内存被占用了,没有释放就无法让其他的使用)

举个栗子:

#include
#include
int main()
{
	//这里申请一个10个int型的空间,因为是按照字节来开辟,所以用到了sizeof操作符
	int* pf = (int*)malloc(sizeof(int) * 10);
	if (pf == NULL)
	{
		perror("malloc");
	}
	//这里是对申请空间的使用
	//...


	//在使用完成之后要记得释放,并把指向申请的空间的指针置为空指针
	free(pf);
	pf = NULL;

	return 0;
}

这个里面把pf置为空指针的原因就跟函数开辟的形参差不多

就是在使用完成这片内存空间后,操作系统就不允许我们使用这片空间了

如果不置空的话有可能会发生非法访问内存。

再来举个例子:

malloc、calloc、realloc函数讲解_第1张图片

 在经过for循环,经过我们手动的赋值后,再来观察内存:

malloc、calloc、realloc函数讲解_第2张图片

 等最后free后观察,这片内存空间已经归还给操作系统了:

malloc、calloc、realloc函数讲解_第3张图片

注意!!!

如果我们只申请空间,而不释放空间,想象一下,一个旅馆只登记住人,但是不退房,总有一天房间会被用完的。因此,在申请完空间并使用完之后,要及时地把“房间”给退了。

二、calloc

其实,calloc与malloc起到的是一样的效果

这里我猜想:应该就是在设计malloc函数之后,发现其实很多时候,我们所需要的空间如果可以赋初值的话应该会更方便,于是便有人设计出了calloc函数

由于其用法和malloc有很多共通之处,这里就不再进行阐述。

但是函数的参数类型有所差异,这里进行说明:

calloc

Allocates an array in memory with elements initialized to 0.

void *calloc( size_t num, size_t size );

这里观察到,calloc参数为:

num

Number of elements        元素有多少个

size

Length in bytes of each element        每个元素有多长

calloc函数会自动把申请到的空间都存为0

下面进行代码演示:

int main()
{
	//int*p = (int*)malloc(40);
	//申请10个整形的空间
	int* p = (int*)calloc(10, sizeof(int));//calloc申请的空间会被初始化为0
	if (p == NULL)
	{
		perror("calloc");
		return 1;
	}
	//使用
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	free(p);
	p = NULL;

	return 0;
}

malloc、calloc、realloc函数讲解_第4张图片

 calloc其他地方都是和malloc相同的,这里就不再过多阐述。

三、realloc

看名字,相信大家都不难看出来,realloc就是对于内存开辟空间大小的更改。

那既然对申请空间的大小修改,那就有两种情况——改大、改小

(1)改小

其实,对申请的内存空间改小,可以在原申请处减小可访问字节数,这样就做到了对使用空间的减小。

(2)改大

这里就存在着两种情况了

1.malloc或者calloc申请得到的空间后面有足够的空供我们使用

2.不够使用

对于两种情况:

画图解释:

malloc、calloc、realloc函数讲解_第5张图片

 是不是现在觉得realloc函数太聪明了

由于对于这种空间不足情况的代码不好演示,就不上代码演示了。

不太清楚的朋友可以再看看其他人的讲解

总结:

对于动态内存申请的三个函数,以及归还空间的free函数大概就是这样子了。

你可能感兴趣的:(C进阶,c语言)