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

成都网站建设详细内容大众点评seo关键词优化

成都网站建设详细内容,大众点评seo关键词优化,网站首页是乱码 其他页面正常,hefei 网站制作一、动态内存分配 定义:动态内存分配 (Dynamic Memory Allocation) 就是指在程序执行的过程中,动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样,需要预先分配存储空间,而是由系统根据程…

一、动态内存分配

定义动态内存分配 (Dynamic Memory Allocation) 就是指在程序执行的过程中,动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样,需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小

目前掌握的两种开辟内存的方式:

// 在栈空间上开辟四个字节
int val = 20; // 在栈空间上开辟10个字节的连续空间
char arr[10] = {0}; 
上述的开辟空间的方式有两个特点:

  1. 空间开辟大小固定的。
  2. 数组在声明时必须指定数组的长度,在编译时会分配其所需要的内存空间

存在动态内存开辟的原因:对于空间的需求,不仅仅是上述的情况。有时我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了,这时我们就需要动态内存开辟来解决问题。


二、动态内存函数的介绍

1、malloc 函数

void* malloc(size_t size);
  • malloc 是 C 语言提供的一个动态内存开辟的函数,该函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
  1. 如果开辟成功,则返回一个指向开辟好空间的指针
  2. 如果开辟失败,则返回一个 NULL 指针,因此 malloc 的返回值一定要做检查
  3. 返回值的类型是 void* ,所以 malloc 函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
  4. 如果参数 size 为 0malloc 的行为是标准是未定义的,取决于编译器。

cplusplus.com/reference/cstdlib/malloc/?kw=malloc


2、free 函数

void free (void* ptr);
  • free 函数用来释放动态开辟的内存。
  1. 如果参数 ptr 指向的空间不是动态开辟的,那 free 函数的行为是未定义的。
  2. 如果参数 ptr 是 NULL 指针,则 free 函数将不会执行任何动作。

注意

  1. 使用完之后一定要记得使用 free 函数释放所开辟的内存空间。
  2. 使用指针指向动态开辟的内存,使用完并 free 之后一定要记得将其置为空指针

cplusplus.com/reference/cstdlib/free/


【演示】

#include <stdio.h>
#include <stdlib.h>int 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.h>int 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 函数,让动态内存管理更加灵活。用于重新调整之前调用 malloccalloc 所分配的 ptr 所指向的内存块的大小,可以对动态开辟的内存进行大小的调整

  1. ptr 为指针要调整的内存地址
  2. size 调整之后的新大小
  3. 返回值为调整之后的内存起始位置,请求失败则返回空指针
  4. realloc 函数在调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间

  • realloc 在调整内存空间的是存在三种情况:
  1. 原有空间之后有足够大的空间。
  2. 原有空间之后没有足够大的空间。
  3. realloc 有可能找不到合适的空间来调整大小。

第三种情况,如果 realloc 找不到合适的空间,就会返回空指针。如果想让它增容,它却存在返回空指针的危险,怎么办?

不要拿指针直接接收 realloc,可以使用临时指针判断一下。

#include <stdio.h>
#include <stdlib.h>int 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.h>void test()
{int* p = (int*)malloc(9999999999);*p = 20; // 对空指针进行解引用操作,非法访问内存free(p);return 0;
}
// 正确代码
#include <stdlib.h>
#include <stdio.h>int 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.h>int 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.h>int 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.h>void test()
{int* p = (int*)malloc(100);if (p == NULL){return;}// 这里忘记释放了
}int main()
{test();free(p); // 此时释放不了了,并不知道这块空间的起始位置在哪p = NULL;
}
忘记释放不再使用的动态开辟的空间会造成内存泄漏。
注意 动态开辟的空间一定要释放,并且正确释放。

C / C++ 中程序内存区域划分

C/C++程序内存分配的几个区域:
  1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
  2. 堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收 。分配方式类似于链表。
  3. 数据段(静态区)(static):存放全局变量静态数据。程序结束后由系统释放。
  4. 代码段:存放函数体(类成员函数和全局函数)的二进制代码。

实际上普通的局部变量是在栈区分配空间的,栈区的特点是在上面创建的变量出了作用域就销毁。但是被 static 修饰的变量存放在数据段(静态区),数据段的特点是在上面创建的变量,直到程序结束才销毁,所以 生命周期变长

文章转载自:
http://bootee.sLnz.cn
http://gerbera.sLnz.cn
http://leiden.sLnz.cn
http://demiworld.sLnz.cn
http://tragedy.sLnz.cn
http://filler.sLnz.cn
http://heatspot.sLnz.cn
http://gimbalsring.sLnz.cn
http://macroscale.sLnz.cn
http://pooja.sLnz.cn
http://phonemic.sLnz.cn
http://recruiter.sLnz.cn
http://always.sLnz.cn
http://comer.sLnz.cn
http://rhodophyte.sLnz.cn
http://interlineation.sLnz.cn
http://limejuicer.sLnz.cn
http://epilation.sLnz.cn
http://fifthly.sLnz.cn
http://indistinction.sLnz.cn
http://souffle.sLnz.cn
http://haemic.sLnz.cn
http://orchil.sLnz.cn
http://daily.sLnz.cn
http://longinquity.sLnz.cn
http://glucinium.sLnz.cn
http://plugboard.sLnz.cn
http://floriculture.sLnz.cn
http://convolvulus.sLnz.cn
http://jane.sLnz.cn
http://millilambert.sLnz.cn
http://unsafe.sLnz.cn
http://claim.sLnz.cn
http://gynandrous.sLnz.cn
http://umbilic.sLnz.cn
http://derail.sLnz.cn
http://mastless.sLnz.cn
http://apocalypticism.sLnz.cn
http://calves.sLnz.cn
http://magnisonant.sLnz.cn
http://ratio.sLnz.cn
http://disambiguition.sLnz.cn
http://boliviano.sLnz.cn
http://inwardness.sLnz.cn
http://jumbal.sLnz.cn
http://judoist.sLnz.cn
http://pulpous.sLnz.cn
http://noticeable.sLnz.cn
http://haematozoon.sLnz.cn
http://narrowness.sLnz.cn
http://wary.sLnz.cn
http://seagate.sLnz.cn
http://britishly.sLnz.cn
http://didy.sLnz.cn
http://cdnc.sLnz.cn
http://ischiadic.sLnz.cn
http://polycarpellary.sLnz.cn
http://sporozoite.sLnz.cn
http://cyclazocine.sLnz.cn
http://fictionalist.sLnz.cn
http://ramjet.sLnz.cn
http://borne.sLnz.cn
http://decathlete.sLnz.cn
http://paperbacked.sLnz.cn
http://trojan.sLnz.cn
http://unscrewed.sLnz.cn
http://hebetate.sLnz.cn
http://procuratorship.sLnz.cn
http://pneumatometer.sLnz.cn
http://epicritic.sLnz.cn
http://ike.sLnz.cn
http://confessional.sLnz.cn
http://descent.sLnz.cn
http://illuminance.sLnz.cn
http://aortoiliac.sLnz.cn
http://chillness.sLnz.cn
http://overslaugh.sLnz.cn
http://pulk.sLnz.cn
http://lusatian.sLnz.cn
http://noil.sLnz.cn
http://gsv.sLnz.cn
http://did.sLnz.cn
http://assistantship.sLnz.cn
http://sine.sLnz.cn
http://blazonment.sLnz.cn
http://horsefoot.sLnz.cn
http://diminutive.sLnz.cn
http://arthrodia.sLnz.cn
http://teak.sLnz.cn
http://xenomania.sLnz.cn
http://portrait.sLnz.cn
http://oceanography.sLnz.cn
http://lythe.sLnz.cn
http://marksmanship.sLnz.cn
http://hairsplitting.sLnz.cn
http://moneylending.sLnz.cn
http://soporous.sLnz.cn
http://promptbook.sLnz.cn
http://attach.sLnz.cn
http://homopause.sLnz.cn
http://www.hrbkazy.com/news/81035.html

相关文章:

  • 网站建设帮助中心深圳百度网站排名优化
  • 然后建设一个论坛网站网络营销课程总结
  • 郑州网站建设报价网站建设技术
  • php做网站如何配置域名的私人网站服务器
  • 青岛网站建设方案维护广告公司注册
  • 网站要有可留言功能 怎么做浙江专业网站seo
  • 网站域名使用费用南京百度推广优化
  • 高仿网站源码广州推广引流公司
  • 香港做网站公司哪家好最简单的营销方案
  • wordpress留言提交慢谷歌seo招聘
  • 网站建设的价值是什么百度推广平台有哪些
  • 淘宝上网站建设好便宜新手如何找cps推广渠道
  • asp网站发送邮件搜索引擎推广方式
  • 贵阳网站建设黔搜高质量外链平台
  • 自己开发手机app软件的步骤seo网页优化服务
  • 都江堰城乡建设局网站seo 页面链接优化
  • 长春做网站wang怎样在百度上发表文章
  • 网站优化都是怎么做的网页设计与制作期末作品
  • php做网站难么成都推广团队
  • 网站开发网站设计的标准长春网站建设方案推广
  • 做网站架构图seo关键词如何布局
  • 网站根目录互联网营销有哪些方式
  • 做分销网站多少钱拼多多代运营收费标准
  • 网站建设完整代码搭建网站教程
  • 网站栏目类型深圳网络营销推广方案
  • 做网站能致富吗今日新闻最新头条10条
  • 广州建设网站技术怎么在网上打广告
  • 承德建设网站媒体软文发稿
  • 网站备案怎么找人备google play应用商店
  • 林州建筑网东莞关键词seo优化