C语言中的动态内存分配函数

1、学习动态内存分配之前要知道在C语言中内存是怎么使用的。

在C语言中内存被分为三个大块,栈区、堆区、静态区。

栈区主要存放局部变量和函数的形式参数。

堆区主要用于动态内存分配。

静态区主要用于存放全局变量和静态变量。

那么我们知道了动态内存分配是在堆区进行的,下面开始介绍动态内存分配函数。

使用动态内存分配函数需要引用<stdlib.h>文件

1、malloc函数:用于动态内存开辟

语法格式:void* malloc (size_t size);

分配一个大小为size字节的内存块,返回该内存块开头的地址

int * p = (int *)malloc(10 * sizeof(int));

分配一个10个整型大小的内存块,将开头地址传递给p。

如果malloc函数分配内存失败则会返回一个空指针。所以使用时需要进行判断。

#include <stdlib.h>
int main()
{
	//分配10个整型大小的内存块,并将地址给p
	int * p = (int *)malloc(10 * sizeof(int));
	//如果p不为空指针则将0-9存放进内存块中
	if (p!=NULL)
	{
		int i = 0;
		for ( i = 0; i < 10; i++)
		{
			*(p + i) = i;
		}
	}
}

2、calloc:内存开辟函数

语法格式:void* calloc (size_t num, size_t size);

分配一块内存用于存放num个元素,每个元素大小为size字节,并将其所有初始化为0,将开头地址返回

int * p = (int *)calloc(10, sizeof(int));

分配存放10个整型大小元素的内存块,并将地址给p

同样的,calloc函数如果分配失败也会返回一个空指针,所以使用空间前也需要判断。

#include <stdlib.h>
int main()
{
	//分配存放10个整型大小元素的内存块,并将地址给p
	int * p = (int *)calloc(10, sizeof(int));
	//如果p不为空指针则将0-9写入内存空间
	if (p!=NULL)
	{
		int i = 0;
		for ( i = 0; i < 10; i++)
		{
			*(p + i) = i;
		}
	}
}

3、free:内存释放函数

通过动态内存分配的内存空间在不使用时要进行释放。

语法格式:void free (void* ptr);

将ptr指向的内存空间进行释放

//分配存放10个整型大小元素的内存块,并将地址给p

 int * p = (int *)calloc(10, sizeof(int));

//内存释放

free(p);

p = NULL;

内存释放后,p的地址还是指向原来的内存块,所以也需要将p变为空指针。

4、realloc:调整动态内存的大小

当我们开辟一块空间后不能够满足需求时,可以使用realloc函数进行大小调整

语法格式:void* realloc (void* ptr, size_t size);

更改ptr指向的内存块的大小为size,如果ptr为空指针则相当于malloc开辟空间。

realloc函数调整空间时分为两种情况。

第一:如果原空间后的内存空间足够分配,则直接进行空间追加。

第二:如果原空间后的内存空间不足分配,则重新开辟一块空间,将开头地址返回。

如果内存调整失败则会返回一个空指针。所以使用前需要进行判断。

#include <stdlib.h>
int main()
{
	//分配存放10个整型大小元素的内存块,并将地址给p
	int * p = (int *)calloc(10, sizeof(int));
	//调整内存块大小为20个整型空间
	int * q = (int *)realloc(p, 20 * sizeof(int));
	if (q!=NULL)
	{
		p = q;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_53086187/article/details/124527767