深入挖掘C语言 ----动态内存分配

这篇具有很好参考价值的文章主要介绍了深入挖掘C语言 ----动态内存分配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开篇备忘录: "自给自足的光, 永远都不会暗"


正文开始

1. malloc和free

1.1 malloc

C语言提供了一个动态开辟内存的函数;

void* malloc (size_t size);

这个函数向内存申请一块连续可用的空间, 并返回指向这块空间的指针.

  • 如果内存开辟成功, 则返回一个指向开辟好空间的指针
  • 如果开辟失败, 则返回一个NULL指针, 因此malloc的返回值一定要做检查
  • 返回值的类型是void* ,所以malloc函数并不知道开辟空间的类型, 具体在使用的时候使用者自己来决定
  • 如果参数size为0, malloc的行为标准是未定义的, 取决于编译器

1.2 free

C语言提供了另外一个函数free, 专门是用来做动态内存释放和回收的, 函数原型如下:

void free (void* ptr);

free函数用来释放动态开辟的内存.

  • 如果参数ptr指向的空间不是动态开辟的, 那free函数的行为是未定义的.
  • 如果参数ptr指向的是NULL指针, 则函数什么事都不用做.

malloc 和 free 都声明在stdlib.h 头文件中

深入挖掘C语言 ----动态内存分配,c语言,开发语言,学习方法
int main()
{
	int* ptr = NULL;
	ptr = (int*)malloc(sizeof(int) * 10);
	if (ptr != NULL)
	{
		for (int i = 0; i < 10; i++)
		{
			*(ptr + 1) = 0;
		}
	}
	free(ptr);
	ptr = NULL;
	return 0;
}

2. calloc和realloc

2.1 calloc

C语言还提供了一个函数叫做calloc, calloc函数也用来动态内存分配, 原型如下:

void* calloc (size_t num, size_t size);
  • 函数的功能是为num个大小为size的元素开辟一块空间, 并且把空间的每个字节都初始化为0
  • 与函数malloc的区别在于calloc会返回地址之前把申请的空间的每个字节初始化为0
深入挖掘C语言 ----动态内存分配,c语言,开发语言,学习方法
int main()
{
	int* p = calloc(10, sizeof(int));
	if (p != NULL)
	{
		for (int i = 0; i < 10; i++)
		{
			printf("%d ", *(p + i));
		}
	}
	free(p);
	p = NULL;
	return 0;
}

运行程序:
深入挖掘C语言 ----动态内存分配,c语言,开发语言,学习方法

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

2.2 realloc

  • realloc函数的出现让动态内存管理更加灵活
  • 有时候我们发现过去申请的空间太小了, 有时候我们又会觉得申请的空间过大了, 那为了合理的使用内存, 我们一定会对内存的大小做灵活调整. 那realloc函数就可以做到对动态开辟内存大小的调整

函数原型如下:

void* realloc (void* ptr, size_t size);
  • ptr 是要调整的内存地址
  • size 调整之后新的大小
  • 返回值为调整之后的内存起始位置
  • 这个函数原内存空间大小的基础上, 还会将内存中的数据移动到新的空间
  • realloc 在调整内存空间的时候存在两种情况:
    1. 原有的空间之后有足够大的空间
    1. 原有的空间之后没有足够大的空间

两种情况如下图所示:

深入挖掘C语言 ----动态内存分配,c语言,开发语言,学习方法

情况1:

要扩展内存就直接原有内存之后直接追加空间, 原来空间的数据不发生变化

情况2:

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

由于上述两种情况, realloc函数的使用就要注意一些:

深入挖掘C语言 ----动态内存分配,c语言,开发语言,学习方法
int main()
{
	int* ptr = (int*)malloc(100);
	if (ptr != NULL)
	{
		//业务处理
	}
	else 
	{
		return 1;
	}

	//扩充容量

	//代码1 - 直接将realloc的返回值放到ptr中
	ptr = (int*)realloc(ptr, 100);//(可以吗? , 如果开辟内存失败又会如何?)

	//代码2 - 先将realloc函数的返回值放在p中, 不为NULL,再放在ptr中

	int* p = NULL;
	p = realloc(ptr, 1000);
	if (p != NULL)
	{
		ptr = p;
	}
	//业务处理

	free(ptr);
	free(p);
	ptr = NULL;
	p = NULL;
	return 0;
}

3. 总结C/C++中程序内存区域划分

深入挖掘C语言 ----动态内存分配,c语言,开发语言,学习方法

C/C++ 程序内存分配的几个区域:

1.栈区(stack): 在执行函数的时候, 函数内局部变量的存储单元都可以在栈上创建,
函数执行结束时这些存储单元自动被释放, 栈内存分配运算内置于处理器的指令集中, 
效率很高, 但是分配的内存容量有限, 栈区主要存放运行函数时而分配的局部变量, 
函数参数, 返回数据, 返回地址等. 这里推荐一本书<<函数栈帧的创建和销毁>>

2.堆区(heap): 一般由程序员分配释放, 若程序员不释放, 程序结束时可能由
OS(操作系统)回收,分配方式类似于链表

3.数据段(静态区): (static) 存放全局变量, 静态数据, 程序结束后由操作系统释放.

4. 代码段: 存放函数体(类成员函数和全局函数)的二进制代码. 

本文内容到此结束, 还望读者点赞关注.文章来源地址https://www.toymoban.com/news/detail-860814.html

到了这里,关于深入挖掘C语言 ----动态内存分配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【c语言进阶】深入挖掘数据在内存中的存储

    铁汁们,今天给大家分享一篇数组及详解冒泡排序,来吧,开造⛳️ 类型的 意义 : 类型是用来创建变量, 变量的创建需要在内存中开辟一块内存空间 ,用来存储变量的值, 类型的大小决定了开辟内存空间的大小 。 基本内置类型: c语言标准只规定sizeof(long)只要大于等于

    2024年02月08日
    浏览(62)
  • 操作系统动态内存分配算法【C语言实现】

    题目: 采用五个算法,各自作业在1024kB空间上分配情况。 内存可变分区分配仿真算法 :首次适应,下次适应,最佳适应,最坏适应和快速分配。 使用的结构体数组表示起始地址,内存块大小,内存块状态(0空闲,1占用) void bubbleprint(struct Info info[]) 函数是为了内存块大小

    2024年02月03日
    浏览(44)
  • C语言【自定义数据类型、typedef、动态内存分配】

    一、自定义数据类型。 ​ 关于下面讲到的所有自定义数据类型(enum、struct、union),有一点要说的是:定义类型不是声明变量,做这步操作时不分配内存,也不能在定义类型时赋值(枚举那个不是赋值,是做一个限定,赋值时赋限定之外的值也不报错。)。 1、typedef (给类

    2024年02月05日
    浏览(46)
  • c语言:通讯录管理系统(动态分配内存版)

    前言: 本通讯录管理系统一共三个版本,除此文章以外还有如下俩个版本,大家可以根据需求自取: 基础增删查改功能版本 :c语言:通讯录管理系统(增删查改)_luming.02的博客-CSDN博客 文件保存版本 :c语言:通讯录管理系统(文件版本)-CSDN博客         本文是在基

    2024年02月08日
    浏览(60)
  • 8.8 【C语言】动态内存分配与指向它的指针变量

    栈:全局变量和局部变量,全局变量是分配在内存中的静态存储区的,非静态的局部变量是分配在内存中的动态存储区的。 堆:数据临时存放在一个特别的自由存储区。 对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这四个函数。 1.用mallo

    2024年02月11日
    浏览(44)
  • 【C语言高阶篇】成为编程高手必学内容,动态内存分配我不允许还有人不会!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,又是新的一天开始了,今天给大家带来的是动态内存规划这一章节!    ⛳️ 我们在创建变量的时候大家都知道大小是固

    2024年02月16日
    浏览(49)
  • 【C语言高阶篇】成为编程高手必学内容,程序中的动态内存分配我不允许还有人不会!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,又是新的一天开始了,今天给大家带来的是动态内存规划这一章节!    ⛳️ 我们在创建变量的时候大家都知道大小是固

    2024年02月16日
    浏览(48)
  • 【C/C++】静态内存分配与动态内存分配

    1.1 - 定义概述 内存分配 (Memory Allocation) 是指为计算机程序或服务分配物理内存空间或虚拟内存空间的一个过程。通常在程序执行前或执行时完成内存分配。 1.2 - 分类概述 存在两种类型的内存分配: 编译时内存分配或静态内存分配 (Compile-time or Static Memory Allocation) 运行时内存

    2024年02月11日
    浏览(41)
  • C++——内存分配与动态内存管理

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 本章我们

    2023年04月17日
    浏览(56)
  • 动态分配内存与释放

    1.malloc malloc()可以找到一个大小合适的块。 内存是匿名的,也就是说,malloc()分配了内存,但没有为它指定名字。 格式如下: double*ptd; ptd=(double*)malloc(30*sizeof(double)); ps:ptd可以看成是一个数组。 malloc()可能分配不到所需的内存。在这种情况下,该函数返回空指针。

    2024年01月17日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包