2021-01-12

动态内存管理

动态内存管理是在堆区开辟空间
创建局部变量是在栈区开辟空间
创建全局变量——静态区

一、动态内存函数
1.malloc
void* malloc (size_t con);
函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
*如果开辟成功,返回一个指向开辟好空间的指针
*如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查
*malloc返回值的类型是void*,所以malloc函数不知道开辟空间的类型,具体在使用的时候自己来决定
相关代码

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

运行结果:
2021-01-12

2.calloc
void* calloc (size_t num,size_t con);
*函数的功能是为num个大小为con的元素开辟一块空间,并且把空间的每个字节初始化为0。
*与函数malloc的区别在于calloc会在返回地址之前把申请的空间的每个字节初始化为0。
相关代码

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

运行结果:
2021-01-12

3.realloc
realloc函数让动态内存管理更加灵活,它可以改变我们开始申请的空间(增大或减小)。
相关代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		ferror(malloc);
		return 1;
	}
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i;
	}
	int* ptr = (int*)realloc(p, 80);
	if (ptr != NULL)
	{
		p = ptr;
	}
	for (i = 10; i < 20; i++)
	{
		*(p + i) = i;
	}
	for (i = 0; i < 20; i++)
	{
		printf("%d ", *(p + i));
	}
	free(p);
	p = NULL;
	return 0;
}

运行结果:
2021-01-12

4.free
动态内存管理申请空间在运行结束是要释放空间,所以free和malloc、calloc、realloc一起使用。
二、结束语
动态内存管理实际上就是要学好上面的4个函数,学会了malloc、calloc、realloc、free这4个函数也就意味着动态内存管理学会了。

上一篇:Redis内存满了怎么办(新年快乐)


下一篇:java实现LRU缓存