【C语言】【动态内存管理】malloc,free,calloc,realloc

1.malloc函数

void* malloc(size_t size)

功能:向内存申请字节为 size大小的空间
使用时要包含头文件:<stdlib.h>
开辟成功:返回开辟好的空间初始地址的指针
开辟失败:返回空指针 NULL

使用举例:
(malloc和free要成对使用,举例放在free部分)

2.free函数:

void free(void* p)

注意free只是用来释放动态内存的,如果不是动态开辟的内存空间,那么free的行为将未定义
使用时要包含头文件:<stdlib.h>

使用举例:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)malloc(4*sizeof(int));
	int i = 0;
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	for (i = 0;i < 4;i++)
	{
		*(p + i) = i + 1;
		printf("%d ", *(p + i));
	}
	free(p);
	p = NULL;
	return 0;
}

注意:free§以后要将p定义为空指针,因为free的功能只是把内存空间释放,但释放完后p还存着那块空间的地址,如果不及时定义为空指针,那么p就会成为野指针

3.calloc函数:

void* calloc(size_t num,size_t size)

功能:向内存申请num个大小为size字节的空间
并且申请的每个字节都初始化为 0

举例:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)calloc(4, sizeof(int));
	if (p == NULL)
	{
		perror("calloc");
		return 1;
	}
	int i = 0;
	for (i = 0;i < 4;i++)
	{
		printf("%d ", * (p + i));
	}
	return 0;
}

在这里插入图片描述

4.realloc函数:

void* realloc(void* p,size_t size)

功能:调整已经开辟的动态内存的大小
p 是要调整的内存的地址
size是调整后总内存的大小
返回值为调整后内存的起始位置的地址

调整空间存在两种情况:
加入两个字节的内存要调整为4个字节:
1.内存够大,从p 地址往后延申两个字节:
在这里插入图片描述
2.p后面不足两个字节,那么就会开辟一块新的空间来存储这 4 个字节的内容
在这里插入图片描述

使用举例:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)malloc(4 * sizeof(int));
	int i = 0;
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	for (i = 0;i < 4;i++)
	{
		*(p + i) = i + 1;
		printf("%d ", *(p + i));
	}
	int* ptr = (int*)realloc(p, 8 * sizeof(int));
	if (ptr != NULL)
	{
		p = ptr;
		ptr = NULL;
	}
	else
		return 1;
	while (8 - i)
	/*for (i = 4;i < 8;i++)*/
	{
		*(p + i) = i + 1;	
		printf("%d ", *(p + i));
		i++;
	}
	free(p);
	p = NULL;
	return 0;
}

在这里插入图片描述

注意:这里为了防止realloc调整空间不成功返回空指针,临时创建个ptr指针来接收地址,确认开辟成功时再将空间地址交给 p ,并把ptr定义为空指针(不能free(ptr),否则p指向的空间也会被回收!!!)