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

医疗网站建设效果越野车网站模板

医疗网站建设效果,越野车网站模板,陕西建设技术学院网站,成都网站建设、前言 我们已经掌握的内存开辟⽅式有#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.dnsts.com.cn/news/93151.html

相关文章:

  • alexa怎么查询网站排名想做外贸如何入手
  • 网站建设案例步骤石家庄建设厅官方网站
  • 餐饮网站建设教程广州的软件开发公司
  • 天津品牌网站建设好处物流网站建设的需求分析
  • 网站建设 東道网络宁波p2p网站建设
  • 网站弄论坛形式怎么做国家查企业的网站
  • 黄岛区建设局网站一个网站一年多少钱
  • 大庆市住房和城乡建设局网站东莞做网站公司
  • 常州网站公司网站手机网站打开微信支付功能
  • 贺州网站推广wrix 网站开发
  • 如何建立一个网站平台广州开发区人才交流服务中心
  • 国外摄影网站云南省科技网站
  • 移动4G网站建设企业电话
  • 外贸企业网站制作哪家好漫画网站建设教程视频
  • 合肥seo网站管理企业官方网站建设的流程
  • 建站之星网站什么网站可以做拍a发布会
  • 专业做卖菜的网站天汇大厦网站建设公司
  • 报考大专网站肇庆用reset插件 复位WordPress
  • 网站建设的目的定位盈利模式和功能福鼎建设局网站
  • 全国学校网站建设163网易企业邮箱格式
  • 分类信息网站平台的推广企业做网站的注意事项
  • 淘宝做代销在哪个网站上进货比较好网站做百度推广需要什么材料
  • 我要下载中国建设网站聊城正规网站建设设计公司
  • 定制网站建设济南网站开发后端作用
  • 北京个人网站设计wordpress分享插件积分
  • 鉴定手表网站2008服务器做网站
  • 做网站代刷能赚多少钱关键词网站建设公司
  • 1000套网站源码嘉兴网站建设wmcn
  • 青岛网站建设培训学校网站服务器租用怎么购买
  • 搭建网站手机软件网站关键词快照优化