0
点赞
收藏
分享

微信扫一扫

一天一道算法题day02

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

❀C语言动态内存管理


前言:在C语言的世界里,动态内存管理是一项既强大又复杂的特性,它赋予了程序员在程序运行时动态地分配和释放内存资源的能力。这一特性是C语言灵活性和高效性的重要基石,同时也是初学者踏入C语言高级编程领域时必须跨越的一道门槛

因此,掌握C语言的动态内存管理技术,对于每一个希望深入理解C语言并编写出健壮、高效程序的开发者来说,都是必不可少的。本文将带领读者从基础概念出发,逐步深入探索C语言中的内存分配函数(如malloc、calloc、realloc)和内存释放函数(如free)的使用方法,以及如何通过合理的内存管理策略来避免常见的内存问题

让我们一起踏上这段探索C语言动态内存管理奥秘的征程吧!


📒1. 动态内存分配

// 我们学过的内存开辟的方式
int val = 20;//在栈空间上开辟四个字节
char arr[10] = {0};//在栈空间上开辟10个字节的连续空间

有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了,这时候就只能试试动态存开辟了


📚2. 动态内存函数的介绍

// 头文件
#include<stdlib.h>

🌞malloc和free

malloc介绍

void* malloc (size_t size);

malloc文档

在这里插入图片描述

注意事项:


free介绍

void free (void* ptr);

free文档

在这里插入图片描述

注意事项:

代码示例 (C语言):

#include<stdio.h>
#include<stdlib.h>

int main()
{
	// 申请一块内存
	int* ptr = (int*)malloc(sizeof(int) * 10);
	if (ptr != NULL) //判断ptr指针是否为空
	{
		for(int i = 0; i < 10; i++)
		{
			(ptr[i]) = i;
		}
	}

	free(ptr); //释放ptr所指向的动态内存
	ptr = NULL;

	return 0;
}

注意事项:


🌙calloc

void* calloc (size_t num, size_t size);

calloc文档

在这里插入图片描述
代码示例 (C语言):

#include<stdio.h>
#include<stdlib.h>

int main()
{
	int* ptr = (int*)calloc(10,sizeof(int));
	if (ptr != NULL)
	{
		// 使用开辟的空间
		// ...
	}

	free(ptr);
	ptr = NULL;

	return 0;
}

在这里插入图片描述

如果我们对申请的内存空间的内容要求初始化,那么可以很方便的使用calloc函数来完成任务


⭐realloc

  • 如果调整成功realloc 会返回指向新内存块的指针,这个新内存块包含了原始数据(在可能的情况下),并且大小已经调整为新的大小
  • 如果调整失败realloc 会返回 NULL 指针,并且原始的内存块不会被释放,因此调用者有责任在失败时释放原始内存以避免内存泄漏
void* realloc (void* ptr, size_t size);

realloc文档

在这里插入图片描述

realloc在调整内存空间的是存在两种情况:

  • 情况1:原有空间之后有足够大的空间
    要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化

  • 情况2:原有空间之后没有足够大的空间
    原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址

在这里插入图片描述
代码示例 (C语言):

// 情况1:原有空间之后有足够大的空间
int main()
{
	int* ptr = (int*)malloc(sizeof(int) * 10);
	if (ptr != NULL)
	{
		// ...
	}

	int* a = (int*)realloc(ptr, 30);

	free(a);
	a = NULL;

	return 0;
}

在这里插入图片描述

代码示例 (C语言):

// 情况2:原有空间之后没有足够大的空间
int main()
{
	int* ptr = (int*)malloc(sizeof(int) * 10);
	if (ptr != NULL)
	{
		// ...
	}

	int* a = (int*)realloc(ptr, 300000);

	free(a);
	a = NULL;

	return 0;
}

在这里插入图片描述


📜3. C/C++程序的内存开辟

在这里插入图片描述
C/C++程序内存分配的几个区域:


📖4. 总结

在探索C语言动态内存管理的旅程即将结束时,我们不难发现,这一领域不仅是编程技能中的一块重要基石,更是深入理解计算机系统与资源管理的一把钥匙。通过掌握malloc、calloc、realloc和free等函数的使用,我们学会了如何在程序运行时根据需要动态地分配和释放内存空间,这为编写高效、灵活且可维护的代码提供了无限可能

“动态内存管理是C语言编程中的一把双刃剑,它既赋予了我们创造无限可能的力量,也要求我们以严谨和负责的态度去驾驭它。愿每一位编程爱好者都能在这条路上越走越远,用智慧和汗水书写属于自己的编程传奇。”

在这里插入图片描述

希望本文能够为你提供有益的参考和启示,让我们一起在编程的道路上不断前行!
谢谢大家支持本篇到这里就结束了,祝大家天天开心!

在这里插入图片描述

举报

相关推荐

0 条评论