周到的做pc端网站,win主机怎样实现wordpress固定链接静态化,中科院网站做的好的院所,wordpress 经过天数文章目录 前言1.为什么要存在动态内存2. malloc和free2.1 malloc2.2 free2.3 使用实例#xff08;malloc和free#xff09; 3. calloc3.1 calloc例子 前言
本文开始将开始学习C语言中一个比较重要的知识点或者是操作——动态内存管理。由于本次的知识比较重要#xff0c;为… 文章目录 前言1.为什么要存在动态内存2. malloc和free2.1 malloc2.2 free2.3 使用实例malloc和free 3. calloc3.1 calloc例子 前言
本文开始将开始学习C语言中一个比较重要的知识点或者是操作——动态内存管理。由于本次的知识比较重要为了方便描述本次知识点分为上下两个章节。本次先跟大家聊一聊上半个章节的知识点——malloc和calloc函数
1.为什么要存在动态内存
目前我们掌握的内存开辟的方式就两种
int val 20;//在栈空间上开辟4个字节
char arr[66] {0};//在栈空间上开辟一个大小为66个字节的连续内存空间但是仔细思考一下你会发现上述内存开辟有两个特点
开辟内存空间的大小是固定不变的数组在声明的时候必须指明数组长度数组的大小一旦确认下来之后就不可以改变了
但是我们对于空间的需求不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道那数组的编译时开辟的内存空间的方式就不能满足我们的需求了。
为此C语言引入了动态内存开辟让程序员可以自己申请和释放空间比较灵活和方便。
2. malloc和free
2.1 malloc
malloc函数是C语言提供的一种动态内存开辟的函数之一其被包含在stdlib.h的头文件中。 具体细节如下 这个函数就是向内存申请一块连续可用的空间并且返回这块空间的起始地址。
总结就是
形参填入需要创建多大内存空间的数量单位是字节。如果参数size为0malloc行为是标准未定义的具体去取决于编译器的实现。返回值如果开辟成功则返回一个指向开辟好空间的指针如果开辟失败则返回一个NULL指针因此malloc函数在使用时一定要注意器返回值的判定。返回值类型void*,所以一般在使用malloc函数一定要进行强制类型转换具体情况按照实际需求来决定。
2.2 free
C语言提供的另外一个用作动态内存开辟重要的函数——free,free函数是专门用来做动态内存的释放和回收的。 函数具体细节如下 free函数是用来释放所申请动态开辟的空间。
如果参数ptr指向的空间不是动态开辟的那么free函数的行为是标准未定义的。如果参数ptr的值为NULL指针则free函数什么事都不做。
注意malloc和free函数都声明在stdlib.h的头文件中。
2.3 使用实例malloc和free
#includestdio.h
#includestdlib.h//malloc的作用
int main()
{int* p (int*)malloc(10*sizeof(int));//动态申请10个整型大小的空间并且malloc函数的返回值做了强制类型转换为int*,原因是我要操作的是整型的数据if (p NULL){perror(malloc failed);return 1;}for (int i 0; i 11; i){*(p i) i 1;}for (int i 0; i 10; i){printf(%d ,p[i]); }free(p);p NULL;//这步很重要,因为我虽然释放了它们的空间但是指针p里面的值确实没有被消除的。//也就是说p仍然还记得那个申请动态空间的起始地址但是那个空间已经被回收了不属于我们的了指针p就成为了也野指针。//为此就要将p置为NULLreturn 0;
}3. calloc
C语言还提供了一个动态开辟内存的函数——calloc 具体细节如下
总结
函数的功能是为num个大小为size的元素开辟一个连续的内存空间并且把空间中的每个字节都初始化为0。与函数malloc功能相似区别只在于calloc函数会在返回地址之前把申请空间的每个字节全初始化为0。
3.1 calloc例子
int main()
{int* p (int*)calloc(10,sizeof(int));//如果申请失败if (p NULL){perror(calloc failed);return 1;}for (int i 0; i 10; i){printf(%d ,p[i]);}free(p);p NULL;return 0;
}正如结果所示calloc函数的作用是申请一块num个大小为size的连续的内存空间并且讲动态开辟的内存空间每个字节都初始化为0了。
所以如果我们对申请的空间的内容要求初始化那么可以很方便的是用calloc函数来完成任务。