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

网站编程 外包类型网站开发后的经验总结

网站编程 外包类型,网站开发后的经验总结,网站建设运营工作业绩,网站后台管理系统破解Hello#xff0c;大家好#xff01;很高兴我们又见面啦#xff01;给生活添点passion#xff0c;开始今天的编程之路。 我们今天来学习C语言中的动态内存管理。 目录 1、为什么要有动态内存管理#xff1f; 2、malloc和free #xff08;1#xff09;malloc函数 大家好很高兴我们又见面啦给生活添点passion开始今天的编程之路。 我们今天来学习C语言中的动态内存管理。 目录 1、为什么要有动态内存管理 2、malloc和free 1malloc函数 2free函数 3、calloc和realloc 1calloc函数 2realloc函数 4、常见的动态内存的错误 1对空指针的解引用问题 2对动态开辟空间的越界访问 3对非动态开辟内存使用free 4使用free释放动态内存的一部分 5对于同一块动态内存多次释放 6动态开辟内存忘记释放 5、柔性数组 1、为什么要有动态内存管理 首先我们了解一下什么是动态内存管理。简单来说就是C语言支持你自己去开辟和释放内存。比方说我想要40字节的内存那么我们就可以灵活的开辟这块内存然后再在这块内存中存放数据。 那么我们直接用常规的方式存储数据不就好了吗可以是可以但是有两个缺点 1、空间开辟大小是固定的比方说int他就是4个字节没法改变。 2、数组在声明的时候必须指定数组的长度。数组空间大小确定了就不能调整了。 而动态内存管理的出现就可以让程序员自己去开辟和释放内存变得更灵活了。 2、malloc和free 1malloc函数 malloc是一个动态内存开辟函数其函数原型如下 这个函数就是用来开辟空间的其中malloc开辟的空间单位为字节。 如果开辟成功就返回一个指向这块空间的指针。 如果开辟失败就返回一个空指针。而null无法被使用。 这就意味着我们在开辟内存后一定要检查返回的是否为空指针。 如果开辟成功返回的指针类型为void*所以我们在使用时要先强制转化该指针。 例如我们现在开辟一块空间并使用它放入内容 #include stdio.h #includestdlib.h int main() {int* p NULL;p (int*)malloc(4);if (p ! NULL){*p 5;printf(%d, *p);}free(p);p NULL;return 0; } 以上是一套完整的开辟空间以及使用代码。大家应该都发现了里面出现了free那么什么是free呢 2free函数 free函数是用来释放动态内存的。 其函数原型如下 如果参数ptr指向的空间不是动态内存那么free函数的行为是未定义的。 如果参数ptr指向空指针那么函数什么事都不做 malloc和free函数的声明都在stdlib.h头文件中。 注意函数在申请内存之后一定要释放内存否则可能会导致内存泄漏或者由于重复开辟内存空间导致占用大量内存 3、calloc和realloc 1calloc函数 函数原型 它可以为num个占用size个字节的元素开辟空间。 和malloc的区别是calloc会把申请的空间全都初始化为0。 例如 #include stdio.h #includestdlib.h int main() {int* p NULL;p (int*)calloc(5,4);if (p ! NULL){int i 0;for (i 0;i 5;i){printf(%d , *(p i));}}free(p);p NULL;return 0; } 运行结果 2realloc函数 这个函数可以让我们调整内存。 函数原型 我们先给定一个申请好动态内存的地址在传入想到让其扩大后的最终大小。 返回值为原内存起始位置。 但需要注意的是倘若我们无法调整到想要的空间大小也就是说在原地址的基础上我们没有足够大的空间来扩充那么该函数会找一个新的地址去开辟这么大的空间在返回新开辟的位置的起始地址。 验证 #include stdio.h #includestdlib.h int main() {int* p NULL;p (int*)malloc(1);//开辟1个字节if (p ! NULL){printf(%p\n, p);p (int*)realloc(p, 2);//扩为两个字节printf(%p\n, p);}elsereturn 1;free(p);p NULL;return 0; } 输出结果 测试代码2 #include stdio.h #includestdlib.h int main() {int* p NULL;p (int*)malloc(4);//开辟4个字节if (p ! NULL){printf(%p\n, p);p (int*)realloc(p, 16);//扩为16个字节printf(%p\n, p);}elsereturn 1;free(p);p NULL;return 0; } 运行结果 那么有没有一种可能就是说他在内存中根本找不到这么大的位置来放这块内存呢 #include stdio.h #includestdlib.h int main() {int* p NULL;p (int*)malloc(4);//开辟4个字节if (p ! NULL){printf(%p\n, p);p (int*)realloc(p, INT_MAX);//扩为最大整形数字printf(%p\n, p);}elsereturn 1;//如果p为NULL直接结束程序。free(p);p NULL;return 0; } 运行结果调整失败        所以说在我们使用realloc是要注意一些。 4、常见的动态内存的错误 1对空指针的解引用问题 #include stdio.h #includestdlib.h int main() {int* p NULL;p (int*)malloc(INT_MAX);//开辟4个字节*p 5;free(p);p NULL;return 0; } 我们无法开辟这个大小的内存空间导致开辟失败返回空指针。程序直接挂掉 2对动态开辟空间的越界访问 #include stdio.h #includestdlib.h int main() {int* p NULL;p (int*)malloc(5*sizeof(int));int i 0;for (i 0;i 6;i){*(p i) 1;printf(%d, *(p i));}free(p);p NULL;return 0; } 当i5时越界访问程序直接挂掉。 3对非动态开辟内存使用free #include stdio.h #includestdlib.h int main() {int* p 5;printf(%d, *p);free(p);p NULL;return 0; } 没有输出结果。 4使用free释放动态内存的一部分 #include stdio.h #includestdlib.h int main() {int* p NULL;p (int*)malloc(5*sizeof(int));p;free(p);p NULL;return 0; } 程序直接挂掉。 5对于同一块动态内存多次释放 #include stdio.h #includestdlib.h int main() {int* p NULL;p (int*)malloc(5*sizeof(int));p;free(p);free(p);p NULL;return 0; } 程序直接挂掉。 6动态开辟内存忘记释放 注意这种情况可能会造成内存泄漏问题当程序简单一些时有可能可以正常运行但是这不代表着可以不释放内存开辟内存和释放内存一定是成套使用的。 5、柔性数组 柔性数组就是一种可以让我们灵活调整其空间的数组。 但是需要注意 1、结构体中柔性数组成员前面至少包含一个其他成员 2、sizeof返回这种结构的大小时不包含柔性数组 3、用malloc调整结构中柔性数组的大小时调整的最终大小应该大于这个结构体的大小。 现在我们使用以下柔性数组 #include stdio.h #includestdlib.h struct s1 {int a;int arr[0];//柔性数组我们不填入他的大小 }s; int main() {struct s1 *p (struct s1*)malloc(sizeof(struct s1) 10 * sizeof(int));//结构体指针名称为p//开辟一块地址大小为结构s所占字节加上100个整型大小给柔性数组if (p ! NULL)//还记得吗我们要判断是不是空指针{int i 0;for (i 0;i 10;i){p-arr[i] i;//访问结构体指针成员必须用结构体指针名称指向这个元素printf(%d , p-arr[i]);}struct s1* p1 (struct s1*)realloc(p, sizeof(struct s1) 15 * sizeof(int));//判断是否为空指针我们这里省略了for (i 10;i 15;i){p1-arr[i] i;//访问结构体指针成员必须用结构体指针名称指向这个元素printf(%d , p1-arr[i]);}free(p);p NULL;return 0;}elsereturn 1; } 这是一套完整的使用并调整柔性数组大小的代码。 那么我们现在思考一下如果不用柔性数组我们可以完成以上操作吗 #include stdio.h #includestdlib.h struct s1 {int a;int *arr; }s; int main() {struct s1 *p (struct s1*)malloc(100 *sizeof(int));//这里我们先划定p这个结构体指针变量所在的那一块空间if (p ! NULL)//还记得吗我们要判断是不是空指针{p-arr (int*)malloc(10 * sizeof(int));int i 0;for (i 0;i 10;i){p-arr[i] i;//下标引用操作符的实质是指针printf(%d , p-arr[i]);}p-arr (int*)realloc(p,15 * sizeof(int));//调整内存空间for (i 10;i 15;i){p-arr[i] 1;//下标引用操作符的实质是指针printf(%d , p-arr[i]);}free(p-arr);//我们开辟了两次内存所以就要释放两次。p-arr NULL;free(p);p NULL;return 0;}elsereturn 1; } 尽管过程有些许的坎坷但我们也是完成了这串代码。 以上两串代码的输出结果 那么这两种代码写法哪一个更好的 答案是柔性数组更好。因为柔性数组方便内存释放我们只用释放一次就好。 其次柔性数组更有利于访问速度而且我们的代码写起来不也更简单吗 好了今天的内容就分享到这觉得有帮助的老铁点点关注支持一下我们下次再见
http://www.zqtcl.cn/news/86665/

相关文章:

  • 网站建设公司使用图片侵权使用者有无责任wordpress po修改
  • 滁州商业网站建设电子商务官方网站
  • 怀化电视台网站app官方网站
  • 培训中心网站建设方案网址申请注册方法
  • 柳州网站建设源码哪些网站收录排名好
  • 如果给公司做网站7k7k游戏网页版入口
  • 免费做请帖的网站网站前期推广
  • 网站加搜索框html5编辑器手机版
  • 动漫做a视频网站包头有没有专业做淘宝网站的
  • 自定义网站模块高速建设材料在哪个网站购买
  • 物流网站建设与管理php中文网
  • 陕西西乡网站建设模板网站建设信息
  • 跨境电商网站建设流程计算机网站建设知识
  • 做网站如何写代码什么是电子商务模式
  • 阿里云服务器上传网站行业网站
  • 稳定的常州网站推广电话营销外包公司
  • 网站建设 架构广州网站(建设信科网络)
  • 建设工程规范在哪个网站发布建筑模板生产厂家有哪些
  • 宁国网站设计公司好商网
  • 做网站的公司怎么推广做网站怎么在图片里面插字
  • 网站制作的服务商私人定制网站建设
  • 官方网站面膜做微商常州模板建站定制网站
  • 湖南工程建设监理有限公司网站免费不收费的app
  • 网站空间选择免费咨询
  • 陆丰网站北京最贵商场
  • 西宁网站制作费用是多少网站建设开发报价单
  • qq网站登录网址深圳小程序公司
  • 株洲网站排名电商网站图片是谁做
  • 莱芜网站推广跳转网站怎么做
  • 辽宁省建设厅网站中级职称公示语音app开发公司