当前位置: 首页 > news >正文

家具建设企业网站vr全景怎么做小程序

家具建设企业网站,vr全景怎么做小程序,口碑营销策略有哪些,互助网站开发说到内存#xff0c;大家一定都知道。但是有一种函数可以实现动态内存管理#xff0c;下面大家一起学习。 文章目录 一、为什么要有动态内存管理#xff1f;二、malloc 和 free1.malloc2.free 三、calloc 和 realloc1.calloc2.realloc3.常见的动态内存的错误3.1对NULL指针的… 说到内存大家一定都知道。但是有一种函数可以实现动态内存管理下面大家一起学习。 文章目录 一、为什么要有动态内存管理二、malloc 和 free1.malloc2.free 三、calloc 和 realloc1.calloc2.realloc3.常见的动态内存的错误3.1对NULL指针的解引用错误3.2对动态开辟空间的越界访问3.3对非动态开普内存使用free释放3.4 使用free释放一块动态开辟内存的一部分。3.5 对同一块动态内存多次释放。3.5 动态开辟内存忘记释放内存泄漏 4.经典笔试题分析4.14.24.34.4 四、柔性数组1.柔性数组的特点2.柔性数组的使用 一、为什么要有动态内存管理 经过c语言的学习相信大家都知道如何开辟一块内存。 int i 6; int arr[10]{0};上面代码开辟的空间有两个特点 空间开辟大小是固定的。数组在申明的时候必须指定数组的长度数组空间一旦确定大小就不能调整了。 这时候我们会发现当我们写代码的时候我们需要开辟多少空间在程序运行的时候才能知道。这时候就需要引入动态内存开辟了让程序员自己申请和释放空间。 二、malloc 和 free 1.malloc void* malloc (size_t size);这个函数向内存申请一开连续可用的空间并返回指向这块空间的指针。 如果开辟成功则返回一个指向开辟好空间的指针。如果开辟失败则返回一个NULL指针因此malloc的返回值一定要做检查。返回值的类型是void*所有malloc函数并不知道开辟空间的类型具体在使用的时候使用者自己来决定。如果参数size为0malloc的行为是标准的未定义取决于编译器。 这个代码用了malloc函数申请空间先是申请了20个字节的空间强制转换为整形变为存放5个整数。 2.free void free (void* ptr);函数free是专门用来给动态内存的释放和回收的。 如果参数ptr指向的空间不是动态开辟的那么free函数的行为毫无意义。如果参数ptr是NULL指针则函数什么事都不做。 #include stdio.h #include stdlib.hint main(){int num 0;scanf(%d, num);int arr[num] {0};int* ptr NULL;ptr (int*)malloc(num*sizeof(int));if(NULL ! ptr)//判断ptr指针是否为空{ int i 0;for(i0; inum; i){*(ptri) 0}}free(ptr);/释放ptr所指向的动态内存ptr NULL;//是否有必要return 0;}需要注意的是使用free函数释放内存后我们不能再访问该内存块否则会导致未定义的行为。此外如果我们尝试释放已经释放过的内存块或者释放非动态分配的内存块也会导致未定义的行为。当动态内存使用完毕之后用free释放释放后的指针是野指针记得置空。 三、calloc 和 realloc 1.calloc void* calloc (size_t num, size_t size);calloc函数的功能是为num个大小为size的元素开辟一块空间并把空间的每个字节置为0。 calloc函数与malloc函数的区别只在于calloc会在地址返回之前把申请的空间全部置为0。 输出结果全为 0 当我们需要对申请的内存空间的内容进行初始化的时候calloc函数就很方便的解决了这一问题。 2.realloc void* realloc (void* ptr, size_t size);realloc函数的出现让动态内存管理更加灵活。 有时会我们发现过去申请的空间太⼩了有时候我们⼜会觉得申请的空间过⼤了那为了合理的使⽤内存我们⼀定会对内存的⼤⼩做灵活的调整。那realloc函数就可以做到对动态开辟内存大⼩的调整。 ptr是要调整的内存地址。 size是调整之后新的大小。 返回值为调整之后的内存起始位置。 这个函数调整原内存空间大小的基础上还会将原来内存中的数据移动到新的空间。 realloc函数调整内存的是存在两种情况 1. 原有空间之后有足够大的空间。2. 原有空间之后没有足够大的空间。这种情况当原有空间后面内存正好可以放下我们扩展的内存的时候。扩展内存就直接再原有内存之后直接追加空间原有空间数据不发生变化。 这种情况当原有空间之后没有足够多的空间时扩展方法时在堆空间上另找一个合适大小的连续空间来使用这样函数返回的是一个新的内存地址。 3.常见的动态内存的错误 3.1对NULL指针的解引用错误 void test(){int *p (int *)malloc(INT_MAX/4);*p 20;free(p);}这个代码没有判断p是否为空指针如果对空指针解引用可能会出现非法访问的错误。 3.2对动态开辟空间的越界访问 void test(){int i 0;int *p (int*)malloc(10*sizeof(int));if(NULL p){exit(EXIT_FAILURE);}for(i0; i10; i){ *(pi) i;}free(p);} 当i是10的时候指针已经越界访问了。 3.3对非动态开普内存使用free释放 void test{int a 10;int* pa;free(p);}要知道栈上的内存是不需要程序员手动释放的只有堆上的内存需要程序员手动释放。 释放堆上内存的主要原因 避免内存泄漏如果我们不释放动态分配的内存那么这块内存将一直被程序占用无法被其他部分使用。如果重复分配内存而不释放最终会导致内存耗尽程序崩溃或运行缓慢。释放不再使用的内存在程序执行过程中可能会动态地分配和释放内存。当我们不再需要某个内存块时通过释放它可以将其返回给操作系统以便其他程序可以使用这块内存。防止悬空指针如果我们释放了一块内存但仍然保留了指向该内存的指针那么这个指针就成为了悬空指针。使用悬空指针可能导致未定义的行为例如访问无效的内存引发程序崩溃或产生不可预测的结果。通过释放内存并将指针置为可以避免悬空指针的问题。提高内存利用率释放不再使用的内存可以提高内存的利用率。这对于内存有限的嵌入式系统或需要处理大量数据的应用程序尤为重要。 不需要释放栈上内存的原因 1. 自动管理栈上的内存分配和释放是由编译器自动完成的程序员不需要手动干预。当函数执行完毕或者局部变量超出作用域时编译器会自动将其所占用的内存空间释放。 2. 先进后出栈是一种后进先出LIFO的数据结构栈上的内存分配和释放遵循这个原则。每次函数调用时会将局部变量和参数压入栈中当函数返回时会将这些变量从栈中弹出实现内存的自动释放。 3. 快速高效由于栈上的内存分配和释放是由编译器自动完成的所以速度非常快。相比于堆上的内存分配和释放栈上的内存管理更加高效。 3.4 使用free释放一块动态开辟内存的一部分。 void test(){int *p (int *)malloc(100);p;}free(p);这个代码p指针发生变化p指针不在指向这块内存的起始位置那么最后free只能释放一部分内存造成内存泄漏。 3.5 对同一块动态内存多次释放。 void test(){int *p (int *)malloc(100);free(p);free(p);//重复释放}对同一块动态内存多次释放可能会造成内存泄漏、悬空指针、程序崩溃。 3.5 动态开辟内存忘记释放内存泄漏 void test(){int *p (int *)malloc(100);if(NULL ! p){*p 20;}}int main(){test();while(1);}忘记释放不再使⽤的动态开辟的空间会造成内存泄漏。 切记动态开辟的空间⼀定要释放并且正确释放。 4.经典笔试题分析 4.1 void GetMemory(char *p){p (char *)malloc(100);}void Test(void){char *str NULL;GetMemory(str);strcpy(str, hello world);printf(str);}在GetMemory函数中用malloc函数为p重新分配了内存但是这个分配的内存并没有被传回函数中因为在main函数中函数参数是按值传递的所以在GetMemory函数中重新分配内存并不会改变str指针在main函数中的值。 在main函数中str指针被初始化为NULL传递给GetMemory函数。由于GetMemory函数中的参数是按值传递的所以GetMemory函数内部对p指针的修改不会影响到str指针。所以str指针仍然是NULL指针在后面的strcpy和printf中会导致对空指针的解引用产生未定义的内容。 4.2 char *GetMemory(void){char p[] hello world;return p;}void Test(void){char *str NULL;str GetMemory();printf(str);}这个代码中GetMemory函数是创建在栈上的里面的char数组也是栈空间。随着函数的释放返回到main函数的虽然是这个数组的首地址但是str已经无权访问了变成了空指针。虽然有可能代码最后会输出hello word 那是因为这个空间还没有被系统的其他空间所覆盖。 4.3 void GetMemory(char **p, int num){*p (char *)malloc(num);}void Test(void){char *str NULL;GetMemory(str, 100);strcpy(str, hello);printf(str);}传址调用并且 GetMemory函数用二级指针**p接收。在GetMemory函数释放空间的时候成功的传回了动态内存的首地址使得str不在是空指针可以进行strcpy和printf。但是没有释放p。 4.4 void Test(void){char *str (char *) malloc(100);strcpy(str, hello);free(str);if(str ! NULL){strcpy(str, world);printf(str);}}过早释放动态没有了对动态内存空间的访问权限。后面的world无法拷贝。 四、柔性数组 C99中结构中的最后⼀个元素允许是未知⼤⼩的数组这就叫做『柔性数组』成员。 struct st_type{int i;int a[];//柔性数组成员};1.柔性数组的特点 1.结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。 2.sizeof返回的这种结构⼤⼩不包括柔性数组的内存。 3.包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配并且分配的内存应该⼤于结构的⼤⼩以适应柔性数组的预期⼤⼩。 2.柔性数组的使用 struct S {int n;//4int arr[]; };int main() {struct S* ps (struct S*)malloc(sizeof(struct S) 5*sizeof(int));if (ps NULL){perror(malloc);return 1;}ps-n 100;int i 0;for (i 0; i 5; i){ps-arr[i] i;}//调整空间struct S* ptr (struct S*)realloc(ps, sizeof(struct S)10*sizeof(int));if (ptr ! NULL){ps ptr;}//....//释放free(ps);ps NULL;return 0; }到这里动态内存管理基本就结束了大家如果有问题可以一起讨论。谢谢大家
http://www.zqtcl.cn/news/161670/

相关文章:

  • 忘记网站后台地址建设网站协议范本
  • 平面设计素材网站排行榜前十名程序员网站开发框架
  • 搭建一个网站需要多少钱搜搜
  • 做搜狗手机网站手工制作大全折纸
  • 万网站天眼查询个人信息
  • 一份优秀的网络推广方案名风seo软件
  • 自己建设一个网站步骤中文wordpress主题下载
  • 如何在中国建设银行网站转账成都网页设计培训学校哪家好
  • 青岛建设网站制作wordpress代码高亮显示
  • 品牌创意型网站建设仿 手机 网站模板html
  • 信息化建设期刊网站网络规划设计师 用途
  • 商城网站开发的完整流程图精灵网站建设
  • 网站开发技术描述asp网站建设下载
  • 十堰网站开发洛阳网站开发公司
  • 做盗版网站坂田网站建设推广公司
  • 怎么用织梦修改建设一个新的网站小程序无代码开发平台
  • 网站建设询价外贸网页制作公司哪家好
  • 网页设计与网站建设报告ckplayer整合WordPress
  • 厦门APP开发网站开发公司百度热搜榜单
  • 网站排名英文怎么说网页编辑器在线使用
  • 湖南做防水堵漏工程商网站网站建设编程软件
  • 网站编辑专题怎么做徐州建筑工程招投标网站
  • 英文网站建设合同招考网站开发
  • 网上商城网站 找什么做dede本地环境搭建网站
  • 网站开发遇到的问题及解决方法深圳市做网站有哪些公司
  • 自媒体网站 程序18款免费软件app下载推荐
  • 产业园门户网站建设方案瑞昌网络推广
  • 长春市网站建设动漫wordpress主题下载地址
  • 如何做专业的模板下载网站wordpress 多网址
  • 做qq头像的网站wordpress 安装 服务器 系统