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

成都个人团队网站开发深圳怎么建设网站

成都个人团队网站开发,深圳怎么建设网站,二级域名网站怎么建设,营销 推广一、动态内存分配 定义#xff1a;动态内存分配 (Dynamic Memory Allocation) 就是指在程序执行的过程中#xff0c;动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样#xff0c;需要预先分配存储空间#xff0c;而是由系统根据程…一、动态内存分配 定义动态内存分配 (Dynamic Memory Allocation) 就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间而是由系统根据程序的需要即时分配且分配的大小就是程序要求的大小。 目前掌握的两种开辟内存的方式 // 在栈空间上开辟四个字节 int val 20; // 在栈空间上开辟10个字节的连续空间 char arr[10] {0}; 上述的开辟空间的方式有两个特点 空间开辟大小是固定的。 数组在声明时必须指定数组的长度在编译时会分配其所需要的内存空间。 存在动态内存开辟的原因对于空间的需求不仅仅是上述的情况。有时我们需要的空间大小在程序运行的时候才能知道那数组的编译时开辟空间的方式就不能满足了这时我们就需要动态内存开辟来解决问题。 二、动态内存函数的介绍 1、malloc 函数 void* malloc(size_t size); malloc 是 C 语言提供的一个动态内存开辟的函数该函数向内存申请一块连续可用的空间并返回指向这块空间的指针。 如果开辟成功则返回一个指向开辟好空间的指针。 如果开辟失败则返回一个 NULL 指针因此 malloc 的返回值一定要做检查。 返回值的类型是 void* 所以 malloc 函数并不知道开辟空间的类型具体在使用的时候使用者自己来决定。 如果参数 size 为 0malloc 的行为是标准是未定义的取决于编译器。 cplusplus.com/reference/cstdlib/malloc/?kwmalloc 2、free 函数 void free (void* ptr); free 函数用来释放动态开辟的内存。 如果参数 ptr 指向的空间不是动态开辟的那 free 函数的行为是未定义的。 如果参数 ptr 是 NULL 指针则 free 函数将不会执行任何动作。 ⚠ 注意 使用完之后一定要记得使用 free 函数释放所开辟的内存空间。使用指针指向动态开辟的内存使用完并 free 之后一定要记得将其置为空指针。 cplusplus.com/reference/cstdlib/free/ 【演示】 #include stdio.h #include stdlib.hint main() {int arr[10]; // 开辟10个整型空间int* p (int*)malloc(10*sizeof(int)); // 动态开辟10个大小为int的空间if (p NULL) // 判断p指针是否为空{perror(main); // main: 错误信息return 0;}for (int i 0; i 10; i){*(p i) i;}for (int i 0; i 10; i){printf(%d , p[i]);}// 回收空间free(p); // 释放p指针所指向的动态内存p NULL; // 需要手动置为空指针return 0; } 【1】为什么 malloc 前面要进行强制类型转换呢 int* p (int*)malloc(10*sizeof(int)); 为了和 int* p 类型相呼应所以要进行强制类型转换。如果把强制转换删掉其实也不会有什么问题。但是因为有些编译器要求强转所以最好进行一下强转避免不必要的麻烦。 【2】为什么 free 之后一定要把 p 置为空指针 因为 free 之后那块开辟的内存空间已经不存在了它的功能只是把开辟的空间回收掉但是 p 仍然还指向那块内存空间的起始位置这并不合理。所以需要使用 p NULL 把它置成空指针。 3、calloc 函数 void* calloc(size_t num, size_t size); 函数的功能是为 num 个大小为 size 的元素开辟一块空间并且把空间的每个字节初始化为 0。 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全 0。 cplusplus.com/reference/cstdlib/calloc/ #include stdio.h #include stdlib.hint main() {int* p (int*)calloc(10, sizeof(int)); // 开辟10个大小为int的空间40if (p NULL){return 1;}for (int i 0; i 10; i){printf(%d , *(p i));}free(p);p NULL;return 0; } 结论说明 calloc 会对内存进行初始化把空间的每个字节初始化为 0 。如果我们对于申请的内存空间的内容要求其初始化我们就可以使用 calloc 函数来轻松实现。 4、realloc 函数 void* realloc (void* ptr, size_t size); realloc 函数让动态内存管理更加灵活。用于重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小可以对动态开辟的内存进行大小的调整。 ptr 为指针要调整的内存地址。size 为调整之后的新大小。返回值为调整之后的内存起始位置请求失败则返回空指针。realloc 函数在调整原内存空间大小的基础上还会将原来内存中的数据移动到新的空间。 realloc 在调整内存空间的是存在三种情况 原有空间之后有足够大的空间。原有空间之后没有足够大的空间。realloc 有可能找不到合适的空间来调整大小。 第三种情况如果 realloc 找不到合适的空间就会返回空指针。如果想让它增容它却存在返回空指针的危险怎么办 不要拿指针直接接收 realloc可以使用临时指针判断一下。 #include stdio.h #include stdlib.hint main() {int* p (int*)calloc(10, sizeof(int));if (p NULL){perror(main);return 1;}for (int i 0; i 10; i){*(p i) 5;}// 此时这里需要 p 指向的空间更大需要 20 个int的空间int* ptmp (int*)realloc(p, 20*sizeof(int));// 如果ptmp不等于空指针再把p交付给它if (ptmp ! NULL){p ptmp;}free(p);p NULL; } 当要调整的内存地址为 NULL 时realloc 的功能相当于 malloc。  int* p (int*)realloc(NULL, 40); // 这里功能类似于malloc就是直接在堆区开辟40个字节 三、常见的动态内存错误 1、对NULL指针的解引用操作 // error - 错误演示 #include stdlib.h #include stdio.hvoid test() {int* p (int*)malloc(9999999999);*p 20; // 对空指针进行解引用操作非法访问内存free(p);return 0; } // 正确代码 #include stdlib.h #include stdio.hint main() {int* p (int*)malloc(9999999999);if (p NULL) // 对malloc函数的返回值做判空处理{perror(main)return 1;}for (int i 0; i 10; i){*(p i) i; // 对空指针进行解引用操作非法访问内存}return 0; } 2、对动态开辟空间的越界访问 堆上开辟的空间是有范围的。 // error #include stdio.h #include stdlib.hint main() {int* p (int*)malloc(10*sizeof(int)); // 申请10个整型的空间if (p NULL){perror(main);return 1;}for (int i 0; i 40; i) // 越界访问 - 指针p只管理10个整型的空间根本无法访问40个{*(p i) i;}free(p);p NULL;return 0; } 注意为了防止越界访问使用空间时一定要注意开辟的空间大小。  3、对非动态开辟内存使用free释放 #include stdio.h #include stdlib.hint main() {int arr[10] {0};int* p arr;free(p); // 使用free释放非动态开辟的空间 - errorp NULL;return 0; } 4、使用free释放一块动态开辟内存的一部分 void test() {int *p (int *)malloc(100);p;free(p); // p不再指向动态内存的起始位置 } 此时 free(p) 就会出问题释放的是后面的空间。不能从一块动态开辟的内存空间的某一部分释放必须从头开始释放         这么写会导致 p 只释放了后面的空间并不知道这块空间的起始位置这样会存在内存泄露的风险。 ⚠ 注意释放内存空间的时候一定要从头开始释放。 5、对同一块动态内存多次释放 void test() {int *p (int *)malloc(100);free(p);// p NULL;free(p);//重复释放 } 应该在第一次释放后紧接着将 p 置为空指针。 6、动态开辟内存忘记释放内存泄漏 #include stdio.h #include stdlib.hvoid test() {int* p (int*)malloc(100);if (p NULL){return;}// 这里忘记释放了 }int main() {test();free(p); // 此时释放不了了并不知道这块空间的起始位置在哪p NULL; } 忘记释放不再使用的动态开辟的空间会造成内存泄漏。 注意 动态开辟的空间一定要释放并且正确释放。 C / C 中程序内存区域划分 C/C程序内存分配的几个区域 栈区stack在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中效率很高但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。 堆区heap一般由程序员分配释放若程序员不释放程序结束时可能由 OS 回收 。分配方式类似于链表。 数据段静态区static存放全局变量、静态数据。程序结束后由系统释放。 代码段存放函数体类成员函数和全局函数的二进制代码。 实际上普通的局部变量是在栈区分配空间的栈区的特点是在上面创建的变量出了作用域就销毁。但是被 static 修饰的变量存放在数据段静态区数据段的特点是在上面创建的变量直到程序结束才销毁所以 生命周期变长 。
http://www.hkea.cn/news/14327001/

相关文章:

  • 微信企业网站2008iis7建立网站
  • 怎么做电影网站appwordpress去
  • 企业采购网站有哪些茌平网站建设价格
  • 厦门橄榄网站建设wordpress内网和外网
  • 怎么优化推广自己的网站网站优化总结报告
  • 渐变配色网站仿制别人网站
  • 如何在别人网站挂黑链wordpress 被入侵 删文章
  • 哪里有网站建设服务阐述网络营销策略的内容
  • 中文域名是网站名称吗微博营销的定义
  • 住房建设建设部网站常州知名网站公司
  • 怎样管理网站中国人自己的空间站
  • 辽宁网站建设哪里好找谷歌seo排名优化服务
  • 漂亮网站欣赏成都的教育品牌网站建设
  • 全屏网站宽度wordpress回复批准
  • 电脑上不了建设厅网站百度收录在线提交
  • 现代化公司网站建设南沙电子商务网站建设
  • 网站留言板怎么做如何起手做网站项目
  • 保定设计网站建设做网站的网页用什么软件好
  • 好看的知名企业网站软件工程最好的出路
  • 网站建设经费预算表学网页制作有什么用
  • 五彩科技网站建设山东网站建设哪家好
  • 美容行业网站建设多少价格网站开发费用摊销年限
  • 莱特币做空国外网站做网站的公司不给域名
  • 快速建站公司django 企业网站开发
  • 免费做明信片的网站怎么把广告发到各大平台
  • 如今流行的网站建设网站开发需要的编程软件有哪些
  • 百度不收录什么网站科技有限公司取名字
  • 临淄网站制作首选专家百度网盟推广有哪些网站
  • seo网站推广 杭州美化网站代码
  • 网站建设优化怎么做客户管理系统软件