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

求html码源网站广安做网站公司

求html码源网站,广安做网站公司,基础建设是什么意思,wordpress 菜单栏所谓动态内存管理#xff0c;就是使得内存可以动态开辟#xff0c;想使用的时候就开辟空间#xff0c;使用完之后可以销毁#xff0c;将内存的使用权还给操作系统#xff0c;那么动态开辟内存有什么用呢#xff1f; 假设有这么一种情况#xff0c;你在一家公司中工作就是使得内存可以动态开辟想使用的时候就开辟空间使用完之后可以销毁将内存的使用权还给操作系统那么动态开辟内存有什么用呢 假设有这么一种情况你在一家公司中工作该公司开发了一款app要有用户来使用这款app那么添加用户信息的时候需要开辟内存空间但是该开辟的内存空间又是不确定的开辟小了不够用开辟多了又会浪费内存空间以后如果继续有用户使用该app又需要开辟内存空间所以这个时候就需要动态开辟内存空间要用的时候就开辟不用的时候就销毁这就是动态内存管理存在的意义。 学习动态内存管理主要是学习 4 个函数分别是mallocfreecallocrealloc 这四个函数这几个函数都被包含在 stdlib.h 头文件里使用的时候需要包含头文件stdlib.h。接下来就来依次讲解这四个函数。 值得注意的一点是动态内存管理对于以后学习数据结构是必要知识只有学好了动态内存管理才能学好数据结构。 目录 1  malloc函数 2  free函数 3  calloc函数 4  realloc函数 5  动态内存的注意事项 1 一定要检查动态开辟内存是否成功 2 防止对非动态开辟的内存进行释放 3 要避免使用free函数释放一部分动态开辟内存 4 防止对同一块内存空间进行多次释放  5 动态开辟内存后一定要记得使用free函数释放 6  柔性数组 1 柔性数组的定义 2 柔性数组的特点 3 柔性数组的使用 4 柔性数组的优势 7  C/C在内存中的区域划分 1  malloc函数 使用malloc函数时需要注意以下几点 malloc函数 1malloc函数的参数为字节也就是想要开辟空间的字节数2如果开辟失败那么malloc函数的返回值为空指针3如果开辟成功那么malloc函数的返回值为viod*需要强制类型转换为想要开辟空间数据的指针类型如int*float*等等4如果参数size为0那么malloc的行为是未定义 使用malloc函数的例子如下 #includestdio.h #includestdlib.hint main() { //malloc返回值需要强转为int*int num 0;scanf(%d, num);int* arr (int*)malloc(sizeof(num) * 20);//参数为字节//使用malloc的时候一定要判断返回值如果开辟失败那么退出程序if (arr NULL){//perror函数的功能为打印错误信息perror(malloc fail\n);//exit为退出函数exit(1);}//开辟成功for (int i 0; i num; i){scanf(%d, arr[i]);}for (int i 0; i num; i){printf(%d , arr[i]);}return 0; }运行结果 在上述代码中 共开辟了10个空间依次向arr数组里面输入了1,2,3,4,5,6,7,8,9,10这10个数据。 在代码中最关键的一段代码就是判断malloc返回值与强转的那两段代码在动态开辟数据时一定要判断​malloc函数返回值也就是判断有没有成功动态开辟内存空间。 2  free函数 free函数的功能主要是用来释放动态开辟的空间也就是将内存空间的使用权归还给操作系统其注意事项有以下两条 free函数注意事项 1free函数的参数为指针类型这个指针所指向的空间必须是动态开辟的否则其行为是未定义的2如果参数ptr为NULL那么free函数什么都不做 free函数一般是配合其他动态开辟内存的函数使用如malloc函数还有之后的callocrealloc函数值得注意的一点是动态开辟的内存一定要使用free函数释放掉内存否则可能会出现内存泄露的情况正确使用free函数的例子如下 #includestdio.h #includestdlib.hint main() { //malloc返回值需要强转为int*int num 0;scanf(%d, num);int* arr (int*)malloc(sizeof(num) * 20);//参数为字节//使用malloc的时候一定要判断返回值如果开辟失败那么退出程序if (arr NULL){//perror函数的功能为打印错误信息perror(malloc fail\n);//exit为退出函数exit(1);}//开辟成功for (int i 0; i num; i){scanf(%d, arr[i]);}for (int i 0; i num; i){printf(%d , arr[i]);}//使用完之后用free函数销毁动态开辟的空间free(arr);//释放完之后记得要把指针置为NULL否则arr会变成野指针arr NULL;return 0; }在上述代码中使用完free函数释放了arr指针所指向的动态开辟的空间也就是把动态开辟的空间还给了操作系统但是arr指针本身还是指向原来动态开辟的空间所以释放完之后要把arr置为NULL否则arr就变成了野指针会越界访问。 3  calloc函数 calloc函数不同于以上两个函数calloc函数有两个参数第一个参数是想要动态开辟空间的元素个数另一个参数是想要动态开辟的每个元素的字节大小如开辟10个整型空间就可以这样写 calloc(10, sizeof(int)) calloc函数与malloc函数的相同点与区别 相同点区别1返回值都为void*都需要对返回值进行强制类型转换malloc函数只有一个参数为开辟的空间字节的大小calloc函数有两个参数第一个参数是开辟空间元素的个数第二个参数是每个元素的字节数2都是开辟成功会返回动态开辟空间首元素地址开辟失败返回NULLcalloc函数会将所有元素初始化为0malloc不会只是开辟空间不进行初始化 使用calloc函数的例子如下 #includestdio.h #includestdlib.hint main() {int* arr (int*)calloc(10, sizeof(int));//开辟失败if (arr NULL){perror(calloc fail\n);exit(1);}//开辟成功for (int i 0; i 10; i){printf(%d , arr[i]);}//使用完之后要释放free(arr);//释放完之后置为NULLarr NULL;return 0; }运行结果 4  realloc函数 realloc函数是这四个函数里面最复杂的一个函数其最复杂就是因为其能够实现增容。 不管是前面的malloc函数还是calloc函数都只能实现动态开辟一块空间并不能根据已有空间来实现增容的效果而realloc函数可以在原有空间的基础上实现对原有空间的扩大所以有了realloc函数就可以对内存空间做灵活的调整了。 使用realloc函数的注意事项如下 realloc函数注意事项 1第一个参数为指向要扩容的空间的指针2第二个参数为增容之后空间的大小注意是增容之后空间的总大小而不是增容的空间大小如原来空间为10想要增容10个空间第二个参数为203如果开辟成功返回值为指向增容后所有空间的指针如果开辟失败返回值为NULL 对于realloc函数增容有两种情况 1 如果原有空间之后有足够的空间来进行增容那么就会在原有空间之后追加空间原有空间数据不变返回值与第一个参数相同。 2 如果原有空间后面的空间不够要增容的空间大小那么就会在内存的堆区上另找一块内存空间大小原有空间 要增容的空间足够的连续空间并把原有空间的数据复制到新开辟的空间上然后释放旧空间返回新开辟空间的首元素地址。 使用realloc函数的例子如下 #includestdio.h #includestdlib.hint main() {int n 0;scanf(%d, n);int* arr (int*)malloc(sizeof(int) * n);//先用一个中间变量来接收增容后的地址int* tmp (int*)realloc(arr, sizeof(int) * 2 * n);//开辟失败if (tmp NULL){perror(realloc fail\n);exit(1);}//开辟成功将增容后空间地址赋给原有空间地址arr tmp;n 2 * n;for (int i 0; i n; i){scanf(%d, arr i);}for (int i 0; i n; i){printf(%d , arr[i]);}//使用完之后要销毁free(arr);//销毁之后置为NULLarr NULL;return 0; }运行结果 需要注意的一点是在使用realloc函数增容的时候一定要先用一个中间变量接受增容后的地址一定要在确保开辟成功之后再把增容后的地址赋给旧空间的地址要是直接赋给旧空间的地址一旦开辟失败那么旧空间就找不到了。 5  动态内存的注意事项 1 一定要检查动态开辟内存是否成功 如果不检查动态开辟空间函数的返回值如果开辟失败就会造成NULL指针的解引用如 #includestdio.h #includestdlib.hint main() {int* arr (int*)malloc(sizeof(int));*arr 10;free(arr);arr NULL;return 0; } 在上述代码里面开辟成功了还好一旦开辟失败就会造成对NULL指针的解引用势必会报错正确的代码应该这样写 #includestdio.h #includestdlib.hint main() {int* arr (int*)malloc(sizeof(int));//检查返回值是否为NULLif (arr NULL){perror(malloc fail\n);exit(1);}//开辟成功*arr 10;free(arr);arr NULL;return 0; } 2 防止对非动态开辟的内存进行释放 对非动态开辟的内存进行free函数释放其行为是未知的如以下这个代码 #includestdlib.hint main() {int arr[] {1, 2, 4};free(arr);return 0; } 在运行的时候会出现下面这种情况 3 要避免使用free函数释放一部分动态开辟内存 在使用free函数释放动态开辟空间时很容易让指向动态开辟空间的指针改变指向位置如 #includestdlib.h #includestdio.hint main() {int* ptr (int*)malloc(sizeof(int) * 10);if (ptr NULL){exit(1);}for (int i 0;i 10; i){scanf(%d, ptr i);}printf(%p , ptr);free(ptr);ptr NULL; }在上述代码里面在释放空间的时候ptr指针已经不再指向原来动态开辟空间的首元素的地址而是指向的是第二个元素的地址在运行代码时vs编译器也会发生错误 所以在动态开辟内存后我们要避免改变动态开辟内存指针的指向。 4 防止对同一块内存空间进行多次释放  #includestdlib.hint main() {int* ptr (int*)malloc(40);if (ptr NULL){exit(2);}free(ptr);free(ptr);return 0; }运行后同样会发生错误 所以在使用free函数释放完空间之后一定要记得把指针置为NULL防止对其多次释放。 5 动态开辟内存后一定要记得使用free函数释放 动态开辟的内存会在以下两种情况下归还给操作系统 1 程序运行结束时 2 使用free函数释放时 所以一旦一个程序不停止运行而又没有free函数主动释放内存就会造成动态开辟的空间一直占用内存空间越来越少就会造成内存空间的浪费也就是内存泄露。 6  柔性数组 1 柔性数组的定义 在一个结构体里面最后一个元素允许是未知大小的数组这个数组就叫做柔性数组成员。注意柔性数组一定是在结构体里面创建的。 上述定义可能比较抽象下面举个例子 struct A {int i;int a[0]; }; 上述代码里面的a数组就是柔性数组成员数组元素个数为0代表没有成员。如果上述代码在编译器报错的话也可以写成以下代码 struct A {int i;int a[]; }; 上述代码的a数组也是柔性数组数组里面的元素个数不写也代表数组里面没有元素。 2 柔性数组的特点 柔性数组的特点如下 柔性数组的特点 1结构体中的柔性数组成员前必须有一个成员2用 sizeof 关键字返回结构体的大小不包括柔性数组的内存3 包含柔性数组成员的结构体用 malloc 函数进行内存的动态分配且分配的内存大小应该大于结构体的大小以适应柔性数组的预期大小   如 #includestdio.htypedef struct A {int i;int a[0]; }A;int main() {int size sizeof(A);printf(%d , size);return 0; } 运行结果为 通过上述代码可以看到含有柔性数组成员的结构体A其大小确实为4个字节不包含柔性数组成员a数组的大小。  3 柔性数组的使用 对于含有一个柔性数组成员的结构体应该使用malloc函数来动态开辟空间例如 #includestdio.h #includestdlib.htypedef struct A {int x;int a[0]; }A;int main() {A* pa (A*)malloc(sizeof(A) 10 * sizeof(int));//判断是否开辟成功if (pa NULL){perror(malloc fail\n);exit(1);}pa-x 10;for (int i 9;i 0; i--){pa-a[i] i;}printf(%d , pa-x);for (int i 0;i 10;i){printf(%d , pa-a[i]);}//使用完不要忘记销毁free(pa);//释放后要置为NULLpa NULL;return 0; } 运行结果为 上述代码在使用malloc函数开辟带有柔性数组结构体成员的内存空间时malloc函数里面的参数应写的是 sizeof(A) sizeof(int) * 10 而不是直接写字节个数这样写不仅不用计算结构体的大小结构体存在内存对齐现象计算起来比较麻烦而且比较直观后面的 sizeof(int) * 10 就是为柔性数组成员开辟的空间。 4 柔性数组的优势 其实上述柔性数组的功能也可以通过在结构体里添加一个指针变量来达到如 #includestdio.h #includestdlib.htypedef struct A {int x;int* pi; }A;int main() {A* pa (A*)malloc(sizeof(A));if (pa NULL){perror(malloc1 fail\n);exit(1);}pa-x 10;pa-pi (int*)malloc(sizeof(int) * 10);if (pa-pi NULL){perror(malloc2 fail\n);exit(2);}for (int i 9;i 0;i--){pa-pi[i] i;}printf(%d , pa-x);for (int i 0;i 10;i){printf(%d , pa-pi[i]);}//一定要先释放结构体里开辟的数组空间free(pa-pi);//再释放开辟的结构体空间free(pa);pa NULL;return 0; } 运行结果为 可以看到在结构体里添加一个指针变量同样可以达到类似于柔性数组的功能那么柔性数组相比于用指针来实现有什么优势呢 柔性数组的优势 1柔性数组容易进行内存释放通过上述两种实现方式我们可以看到通过柔性数组实现只需要进行一次free释放而使用指针实现需要进行两次free释放所以用柔性数组实现更容易进行内存释放不容易出现内存泄露情况2柔性数组有利于提高访问速度在使用柔性数组实现时只进行了一次malloc动态开辟空间所以开辟的是一块连续的内存空间而在使用指针实现时进行了两次malloc动态开辟空间使其内存不一定是连续的。所以使用柔性数组可以提高访问速度而且会有利于减少内存碎片。 7  C/C在内存中的区域划分 C语言或者C语言共将内存空间划分为以下几个区域 内存区域划分 区域存放内容栈区(Stack)主要是用来进行函数栈帧的创建还用来存放一些局部变量、函数参数、返回数据与返回地址等在堆上开辟的空间是在函数运行完后被销毁。堆区(Heap)向malloc、calloc、realloc函数动态开辟的空间一般都在堆区上开辟在堆区上开辟的空间要么是由程序员主动释放要么是在程序运行结束时由操作系统自动收回。数据段(静态区)主要用来存放全局变量和由static关键字修饰的静态变量在静态区开辟的空间是在程序运行结束时由系统自动释放。代码段用来存放函数体的二进制代码。
http://www.dnsts.com.cn/news/273305.html

相关文章:

  • 永康网站网站建设石家庄网站搭建定制
  • 找人做菠菜网站需要多少钱做一个网站需要什么条件
  • 网站建设需要条件湖州网络推广竞价
  • 什么网站做优化最好?口碑推广
  • 腾讯云网站建设视频教程网站怎么做效果好
  • 网站设计色彩搭配百度品牌广告收费标准
  • 网站建设公司东莞企业应加强自身网站建设
  • 网址链接怎么做出来的泉州seo按天付费
  • 免费网站app代码滁州市建设工程协会网站
  • 建设银行企业信息门户网站网站logo
  • 怎么才算完成一个网站网站自助建站软件
  • 博客网站建设设计报告装修网站效果图
  • 高端网站设计制常州网站建设设计
  • 河南做网站多少钱天津室内设计公司
  • 域名对网站有什么影响吗wordpress英文主题出现汉字
  • 个人备案网站名称大全保姆给老人做爰神马网站
  • 天津网站设计推荐刻如何替别人建网站挣钱
  • 提升了自己的网站企业展厅方案设计公司
  • 永久免费企业网站建设公司制作一个网站价格
  • 网站建设费用做什么科目郑州专业seo推荐
  • 有做兼职赚钱的网站吗wordpress如何编辑器
  • pk10代码网站开发网站会员整合
  • 华强北是什么意思好的网站优化公司
  • 织梦网站建设盱眙有做网站开发的吗
  • 自己做的网站图片打开慢网站备案ip查询网站查询
  • 十大免费游戏网站点开即玩怎么制作手机软件app
  • 成都网站建设模板制作年度网站建设工作总结
  • 建设电子商务网站的预期收益网站怎么做实名认证
  • 常州高端网站建设公司广西新闻
  • 上海 网站 备案页面跳转流程图