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

长沙 网站设计 公司宁波外贸公司500强

长沙 网站设计 公司,宁波外贸公司500强,网站建设可以帮助企业,软件开发公司简介怎么写前言 我们已经掌握的内存开辟⽅式有#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的⽅式有两个特点#xff1a; • 空间开辟⼤⼩是固定的。 • 数组在申明的时候#xff0c;必须指定数组的…前言 我们已经掌握的内存开辟⽅式有 int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的⽅式有两个特点 • 空间开辟⼤⼩是固定的。 • 数组在申明的时候必须指定数组的⻓度数组空间⼀旦确定了⼤⼩不能调整但是对于空间的需求不仅仅是上述的情况。有时候我们需要的空间⼤⼩在程序运⾏的时候才能知 道那数组的编译时开辟空间的⽅式就不能满⾜了。 C语⾔引⼊了动态内存开辟让程序员⾃⼰可以申请和释放空间就⽐较灵活了。 一、malloc和free 1.1malloc c语言提供了一个动态分配内存的函数需要头文件#includestdlib.h void* malloc (size_t size); 我们可以注意到他返回的是void*因为这块空间是帮你开辟的不知道你用来存放什么类型的数据所以他自动存为了void*方便你以后的各种操作比如强转成float*啊int*之类的 1.这个函数向内存申请⼀块连续可⽤的空间并返回指向这块空间的指针。 如果开辟成功则返回⼀个指向开辟好空间的指针。 2.如果开辟失败则返回⼀个 NULL 指针因此malloc的返回值⼀定要做检查。 3.返回值的类型是 void* 所以malloc函数并不知道开辟空间的类型具体在使⽤的时候使⽤者⾃⼰来决定。 4.如果参数 size 为0malloc的⾏为是标准是未定义的取决于编译器。 注意第四条当我们使用的时候一定要避免这种情况的产生。 当我们使用malloc函数时我们也可以借助代码去检查他是否错误错误的原因是什么 #includestdio.h #includestdlib.h int main() {int* a (int*)malloc(2e9);if (a NULL) {perror(malloc);return 1;}printf(win);return 0; } perror这里就是找到错误得原因2e9就是2乘十的九次字节的空间。 1.2 free 头文件同malloc#includestdlib.h void free (void* ptr); free函数⽤来释放动态开辟的内存。 • 如果参数 ptr 指向的空间不是动态开辟的那free函数的⾏为是未定义的。 • 如果参数 ptr 是NULL指针则函数什么事都不做。 第一点要注意你如果ptr指向的内存不是动态开辟的程序可能会崩掉所以一定要特别注意 值得一提的是他这个定义比较抽象free是什么意思他说用来释放内存?释放具体是什么意思很多人其实并没有理解很深刻所以我来说一段我自己的理解来帮助大家理解 malloc函数的功能是开辟一段空间但是是开辟吗其实理解成赋予比较好一点例如 int* a (int*)malloc(40); 他其实是把40大小的空间的使用权限赋予了a同时将把这40个空间的地址给了a 而free呢free的作用是相当于把这块内存还给操作系统了但并没有删除掉a中存储的地址也就是a仍然指向那块地址但那块空间已经不属于程序了 那free了之后我们在用a去访问那块地址就会报错此时a是野指针那为了以后产生不必要的错误我们要把a指针置为空指针。 二、calloc和realloc 1.calloc void* calloc (size_t num, size_t size); • 函数的功能是为 num 个⼤⼩为 size 的元素开辟⼀块空间并且把空间的每个字节初始化为0。 • 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。 所以如果我们对申请的内存空间的内容要求初始化那么可以很⽅便的使⽤calloc函数来完成任务。 2.realloc 作用调整动态内存分配的大小。 void* realloc (void* ptr, size_t size); • ptr 是要调整的内存地址 • size 调整之后新⼤⼩ • 返回值为调整之后的内存起始位置。 • 这个函数调整原内存空间⼤⼩的基础上还会将原来内存中的数据移动到 新 的空间。• realloc在调整内存空间的是存在两种情况 ◦ 情况1原有空间之后有⾜够⼤的空间 ◦ 情况2原有空间之后没有⾜够⼤的空间 情况1 当是情况1的时候要扩展内存就直接原有内存之后直接追加空间原来空间的数据不发⽣变化。情况2 当是情况2的时候原有空间之后没有⾜够多的空间时扩展的⽅法是在堆空间上另找⼀个合适⼤⼩的连续空间来使⽤。这样函数返回的是⼀个新的内存地址。 所以我们要注意不能写出这样一个代码 ptr (int*)realloc(ptr, 1000); 如果申请成功还好如果失败的话ptr原有的地址可能找不到了所以我们应借助另一个指针p如果成功了再把p指向的地址赋给ptr。 三.动态内存经典笔试题分析 #includestdio.h #includestdlib.h void GetMemory(char* p) {p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(str);strcpy(str, hello world);printf(str); } int main() {Test();return 0; } 大家先看这道题输出结果会是什么 答案出乎意料为什么呢注意看在调用GetMemory函数时他是直接传的strstr里面存的是NULL,然后在函数调用时计算机会帮他创建一个临时变量假设叫p这个p中拷贝过str里面存的的内容也是NULL注意str和p的地址是不一样的所以动态分配给p内存并没有给str然后底下又进行对p的控制的内存进行赋值之类的就会报错就会崩溃而且还会发生内存泄漏因为p的地址你没有释放看写入位置正是NULL0x000....所以我们应该怎么改正呢我们可以将str的地址传进去 #includestdio.h #includestdlib.h void GetMemory(char** p) {*p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(str);strcpy(str, hello world);printf(str); } int main() {Test();return 0; } 或者把p的地址进行一个返回拿str接受也是可以的。 看下一题 #includestdio.h #includestdlib.h char* GetMemory(void) {char p[] hello world;return p; } void Test(void) {char* str NULL;str GetMemory();printf(str); } int main() {Test();return 0; } 大家不妨先自己做一下乍一看没有问题一运行就g why?我们来分析一下注意p是一个临时变量当函数运行结束的时候p所支配的空间已经全部还给操作系统了已经不属于程序了但是str现在确实指向这片空间这时候打印就会出现一堆乱码。 下一题 #includestdio.h #includestdlib.h void Test(void) {char* str (char*)malloc(100);strcpy(str, hello);free(str);if (str ! NULL){strcpy(str, world);printf(str);} } int main() {Test();return 0; } 我们会发现欸居然可以打印如果仔细阅读前面的我们其实可以发现free完了之后str已经失去了访问权限但为什么还能打印呢注意此时p已经成为了野指针访问了不该访问的空间这里的空间已经成了操作系统的了但是str仍能访问这片空间所以打印出来了。 那有的童鞋就问了那free free了个集贸什么用都没有在我看来free完和free前的区别就是free完即使你改了有可能操作系统某个操作给你覆盖了如果没有free的话那块空间只能你用。 四.柔性数组 1.表示方法及规则 #includestdio.h #includestdlib.h struct a {int a1;int a2[]; }; struct b {int b1;int b2[0]; }; • 结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。 • sizeof返回的这种结构⼤⼩不包括柔性数组的内存。 • 包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配并且分配的内存应该⼤于结构的⼤⼩以适应柔性数组的预期⼤⼩。 第三点如图。 2.使用方法 #includestdio.h #includestdlib.h struct a {int a1;int a2[]; }; struct b {int b1;int b2[0]; }; int main() {struct a* a0 (struct a*)malloc(sizeof(struct a) sizeof(int) * 100);return 0; } 这样柔性数组成员a2相当于获得了100个整型元素的连续空间。 总结 本篇我们介绍了动态内存分配malloc以及celloc和relloc还有free以及几道经典的面试题如果有帮助还请点个赞哦
http://www.w-s-a.com/news/100661/

相关文章:

  • 班级网站建设规划书专业定制网红变色杯
  • 上海网站设计公司电话甘肃路桥建设集团有限公司官方网站
  • 哈尔滨网站建设网站开发陕西省建设监理工程协会网站
  • 微信公众号电商网站开发wordpress增加论坛
  • 网站建设视频百度网盘下载免费wordpress搭建
  • 哈尔滨市网站建设公司汕头市公司网站建设平台
  • 东莞网站建设方案外包甘肃两学一做网站
  • 网站建设优化排名推广平面设计职业学校
  • 网后台的网站怎么做网站代理商
  • 网站如何转移到新的空间服务器上手机无人区离线地图app
  • 网站建设模板的买域名做网站的坏处
  • 长春做网站qianceyun做景观素材有哪几个网站
  • 自己建的网站也要注册域名吗邯郸市做网站
  • 天津网站建设制作软件潍坊个人做网站
  • 重庆城市建设集团官方网站php用什么做网站服务器
  • 深圳坪山站重庆市园林建设有限公司网站
  • 网站建设图片教程如何用自己的电脑建网站
  • 《网页设计与网站建设》A卷答案广东新闻联播
  • 海南专业网站运营托管wordpress 去掉主题
  • 企业品牌网站制作甜品制作网站
  • 手机网站怎么制作影响力网站建设
  • 猪八戒网站做私活赚钱吗一尊网 又一个wordpress站点
  • 上海市做网站的公司滨州哪里做网站
  • 简单的网站建设步骤wordpress 贴吧主题
  • 金泉网做网站找谁表格做网站
  • 北京做兼职从哪个网站好江西省建设监督网站电子网
  • 什么网站做生鲜比较好安徽建设厅城乡官网
  • 域名购买网站有哪些问题上海装修网站建设
  • 找人做seo要给网站程序河北建设网网站
  • 哪家做网站性价比高wordpress最新文章链接插件