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

建立一个网站需要花多少钱2022年最火文案

建立一个网站需要花多少钱,2022年最火文案,烟台龙口网站建设,庆阳网站设计与建设1. malloc和free C函数库提供了两个函数#xff0c;malloc和free#xff0c;分别用于执行动态内存分配和释放。这些函数维护一个可用内存池。当一个程序另外需要一些内存时#xff0c;它就调用malloc函数#xff0c;malloc从内存池中提取一块合适的内存#xff0c;并向该…1. malloc和free C函数库提供了两个函数malloc和free分别用于执行动态内存分配和释放。这些函数维护一个可用内存池。当一个程序另外需要一些内存时它就调用malloc函数malloc从内存池中提取一块合适的内存并向该程序返回一个指向这块内存的指针。这块内存此时并没有以任何方式进行初始化。如果对这块内存进行初始化非常重要要么自已动手对它进行初始化要么使用calloc函数在下一节描述。当一块以前分配的内存不再使用时程序调用free函数把它归还给内存池供以后之需。 这两个函数的原型如下所示它们都在头文件stdlib.h中声明。 void *malloc( size_t size ); void free( void *pointer );malloc的参数就是需要分配的内存字节字符数 。如果内存池中的可用内存可以满足这个需求malloc就返回一个指向被分配的内存块起始位置的指针。 malloc所分配的是一块连续的内存。例如如果请求它分配100个字节的内存那么它实际分配的内存就是100个连续的字节并不会分开位于两块或多块不同的内存。同时malloc实际分配的内存有可能比你请求的稍微多一点。但是这个行为是由编译器定义的所以你不能指望它肯定会分配比你的请求更多的内存。 如果内存池是空的或者它的可用内存无法满足你的请求会发生什么情况呢在这种情况下malloc函数向操作系统请求要求得到更多的内存并在这块新内存上执行分配任务。如果操作系统无法向malloc提供更多的内存malloc就返回一个NULL指针。因此对每个从malloc返回的指针都进行检查确保它并非NULL是非常重要的。 free的参数必须要么是NULL要么是一个先前从malloc、calloc或realloc稍后描述返回的值。向free传递一个NULL参数不会产生任何效果。 malloc又是如何知道所请求的内存需要存储的是整数、浮点值、结构还是数组呢它并不知情——malloc返回一个类型为void *的指针正是缘于这个原因。标准表示一个void *类型的指针可以转换为其他任何类型的指针。但是有些编译器尤其是那些老式的编译器可能要求在转换时使用强制类型转换。 对于要求边界对齐的机器malloc所返回的内存的起始位置将始终能够满足对边界对齐要求最严格的类型的要求。 2. calloc和realloc 另外还有两个内存分配函数calloc和realloc。它们的原型如下所示 void *calloc( size_t num_elements, size_t element_size ); void realloc( void *ptr, size_t new_size );calloc也用于分配内存。malloc和calloc之间的主要区别是后者在返回指向内存的指针之前把它初始化为0。这个初始化常常能带来方便但如果程序只是想把一些值存储到数组中那么这个初始化过程纯属浪费 时间。calloc和malloc之间另一个较小的区别是它们请求内存数量的方式不同。calloc的参数包括所需元素的数量和每个元素的字节数。根据这些值它能够计算出总共需要分配的内存。 realloc函数用于修改一个原先已经分配的内存块的大小。使用这个函数可以使一块内存扩大或缩小。如果它用于扩大一个内存块那么这块内存原先的内容依然保留新增加的内存添加到原先内存块的后面新内存并未以任何方法进行初始化。如果它用于缩小一个内存块该内存块尾部的部分内存便被拿掉剩余部分内存的原先内容依然保留。 如果原先的内存块无法改变大小realloc将分配另一块正确大小的内存并把原先那块内存的内容复制到新的块上。因此在使用realloc之后就不能再使用指向旧内存的指针而是应该改用realloc所返回的新指针。 最后如果realloc函数的第1个参数是NULL那么它的行为就和malloc一模一样。 3. 使用动态分配的内存 这里举一个例子 int *pi; pi malloc(100); if (pi NULL) {printf(Out of memory!\n);exit(1); }符号NULL定义于stdio.h它实际上是字面值常量0。它在这里起着视觉提醒器的作用提醒我们进行测试的值是一个指针而不是整数。 如果内存分配成功那么我们就拥有了一个指向100个字节的指针。在整型为4个字节的机器上这块内存将被当作25个整型元素的数组因为pi是一个指向整型的指针。 如果目标就是获得足够存储25个整数的内存这里有一个更好的技巧来实现这个目的。 pi malloc( 25 * sizeof( int ) );这个方法更好一些因为它是可移植的。即使是在整数长度不同的机器上它也能获得正确的结果。 既然已经有了一个指针那么该如何使用这块内存呢当然可以使用间接访问和指针运算来访问数组的不同整数位置下面这个循环就是这样做的它把这个新分配的数组的每个元素都初始化为0 int *pi2, i; pi2 pi; for (i 0; i 25; i) {*pi2 0; }不仅可以使用指针也可以使用下标。下面的第2个循环所执行的任务和前面一个相同。 int *pi2, i; pi2 pi; for (i 0; i 25; i) {pi2[i] 0; }4. 常见的动态内存错误 在使用动态内存分配的程序中常常会出现许多错误。这些错误包括对NULL指针进行解引用操作、对分配的内存进行操作时越过边界、释放并非动态分配的内存、试图释放一块动态分配的内存的一部分以及一块动态内存被释放之后被继续使用。 动态内存分配最常见的错误就是忘记检查所请求的内存是否成功分配。这种问题显而易见被访问的内存可能保存了其他变量的值。对它进行修改将破坏那个变量修改那个变量将破坏存储在那里的值。这种类型的bug非常难以发现。下面的程序展现了一种技巧可以很可靠地进行这个错误检查。MALLOC宏接受元素的数目能及每种元素的类型计算总共需要的内存字节数并调用alloc获得内存。alloc调用malloc并进行检查确保返回的指针不是NULL。 这个方法最后一个难解之处在于第1个非比寻常的#define指令。它用于防止由于其他代码块直接塞入程序而导致的偶尔直接调用malloc的行为。增加这个指令以后如果程序偶尔调用了malloc程序将由于语法错误而无法编译。在alloc中必须加入#undef指令这样它才能调用malloc而不至于出错。 alloc.h错误检查分配器:接口 /* ** 定义一个不易发生错误的内存分配器。 */ #include stdlib.h #define malloc //不要直接调用malloc! #define MALLOC(num,type) (type *)alloc( (num) * sizeof(type) ) extern void *alloc( size_t size );alloc.c错误检查分配器实现 /* ** 不易发生错误的内存分配器的实现 */ #include stdio.h #include alloc.h #undef malloc void * alloc( size_t size ) { void *new_mem; /* ** 请求所需的内存并检查确实分配成功 */ new_mem malloc( size ); if( new_mem NULL ){ printf( Out of memory!\n ); exit( 1 ); } return new_mem; }a_client.c使用错误检查分配器 /* ** 一个使用很少引起错误的内存分配器的程序 */ #include alloc.h void function() {int *new_memory; /* ** 获得一串整型数的空间 */ new_memory MALLOC( 25, int ); /* ... */ }动态内存分配的第二大错误来源是操作内存时超出了分配内存的边界。例如如果得到一个25个整型的数组进行下标引用操作时如果下标值小于0或大于24将引起两种类型的问题。这种问题就不是那么明显。在malloc和free的有些实现中它们以链表的形式维护可用的内存池。对分配的内存之外的区域进行访问可能破坏这个链表这有可能产生异常从而终止程序。 当使用free时可能出现各种不同的错误。传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。传给free函数一个指针让它释放一块并非动态分配的内存可能导致程序立即终止或在晚些时候终止。试图释放一块动态分配内存的一部分也有可能引起类似的问题像下面这样 /* ** 获得10个整型内存空间 */ pi malloc( 10 * sizeof(int)) ; /* ** 释放最后5个整型类型的内存空间保留前5个内存空间 */ free(pi 5); }释放一块内存的一部分是不允许的。动态分配的内存必须整块一起释放。但是realloc函数可以缩小一块动态分配的内存有效地释放它尾部的部分内存。 必须小心在意不要访问已经被free函数释放了的内存。这个警告看上去很显然但这里仍然存在一个很微妙的问题。假定对一个指向动态分配的内存的指针进行了复制而且这个指针的几份拷贝散布于程序各处。无法保证当使用其中一个指针时它所指向的内存是不是已被另一个指针释放。另一方面必须确保程序中所有使用这块内存的地方在这块内存被释放之前停止对它的使用。 内存泄漏 当动态分配的内存不再需要使用时它应该被释放这样它以后可以被重新分配使用。分配内存但在使用完毕后不释放将引起内存泄漏(memory leak)。在那些所有执行程序共享一个通用内存池的操作系统中内存泄漏将一点点地榨干可用内存最终使其一无所有。要摆脱这个困境只有重启系统。 其他操作系统能够记住每个程序当前拥有的内存段这样当一个程序终止时所有分配给它但未被释放的内存都归还给内存池。但即使在这类系统中内存泄漏仍然是一个严重的问题因为一个持续分配却一点不释放内存的程序最终将耗尽可用的内存。此时这个有缺陷的程序将无法继续执行下去它的失败有可能导致当前已经完成的工作统统丢失。
http://www.w-s-a.com/news/782822/

相关文章:

  • 东莞百度网站推广ppt模板免费下载的网站
  • 网站建设项目管理基本要求网站空间到期影响
  • 做奖杯的企业网站谁有推荐的网址
  • wordpress能做企业站吗wordpress收发邮件
  • 电子产品网站建设策划方案腾讯企业邮箱注册申请免费
  • 哪些网站可以免费做代码自己电脑做网站服务器广域网访问
  • 高端网站设计青海省教育厅门户网站学籍查询
  • 长春网站优化公司网站制作400哪家好
  • 县级门户网站建设的报告开发游戏的软件有哪些
  • 做电子商务的网站wordpress带会员中心
  • 网站域名不变网站可以从做吗网站建设步骤 文档
  • 网站建设中 gif互联网新项目在哪里找
  • 做外包网站猎头公司英文
  • 房屋结构自建设计 网站海淀教育互动平台
  • 网络营销比赛 营销型网站策划热门搜索关键词
  • 网站建设图片代码网络设计师工资
  • 福建网站开发适合交换友情链接的是
  • 企业门户网站建站内乡微网站开发
  • 在线做logo印章网站一般到哪个网站找数据库
  • 哪些网站做免费送东西的广告6郑州人流医院哪家好
  • 高端做网站哪家好sem技术培训
  • 网站做等保是按照什么定级别的做网站的资源哪里找
  • 免费建站网页无需登陆潍坊高端模板建站
  • 北京php网站建设软通动力外包值得去吗
  • 优酷 做视频网站还能成功吗光谷做网站推广哪家好
  • 培训学校网站建设方案网站开发方案设计
  • 网站开发分支结构外贸网站做推广
  • 海南省城乡建设厅网站首页济南网站建设百家号
  • wordpress 图片命名吗北京seo优化哪家公司好
  • 国税网站页面申报撤销怎么做网站空间如何买