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

网站群cms三杰网站建设

网站群cms,三杰网站建设,兰州网站制作公司在哪里,wordpress tag标签调用接上一篇文章http://t.csdn.cn/1ONDq#xff0c;这次我们继续讲解关于动态内存的相关知识。 一、常见的动态内存错误 1.对NULL指针进行解引用操作 #includestdio.h #includestdlib.h #includelimits.h int main() {int* p (int*)malloc(INT_MAX/4);… 接上一篇文章http://t.csdn.cn/1ONDq这次我们继续讲解关于动态内存的相关知识。 一、常见的动态内存错误 1.对NULL指针进行解引用操作 #includestdio.h #includestdlib.h #includelimits.h int main() {int* p (int*)malloc(INT_MAX/4);*p 20;//如果没有足够的空间导致p为NULL就会有问题//所以必须对malloc的返回值进行判断free(p);p NULL;return 0; } 2.对动态开辟空间的越界访问 int main() {int* p (int*)malloc(40);if (p NULL){perror(malloc);return 1;}int i 0;for (i 0; i 11; i){p[i] 0;//原本只申请了十个整型的空间但却访问十一个整型//所以造成越界访问}free(p);p NULL;return 0; } 3.对非动态开辟的内存使用free释放 int main() {int a 0;int* p a;free(p);//p不是动态开辟的空间不能释放p NULL;return 0; } 4.使用free释放动态开辟内存的一部分 int main() {int* p (int*)malloc(40);if (p NULL){perror(malloc);return 1;}int i 0;for (i 0; i 5; i){p[i] 0;p;}//p导致p不再指向这块空间的起始地址//所以如果释放p等于释放这块空间的一部分后五个整型空间//这样就会出问题free(p);p NULL;return 0; } 5.对同一快动态内存多次释放 int main() {int* p (int*)malloc(40);if (p NULL){perror(malloc);return 1;}free(p);//。。。。。free(p);//有时候头脑不清醒就可能释放多次这样就会出问题return 0; } 6.动态开辟内存后忘记释放内存最常见 即我们动态申请内存后最后忘记用free释放了这样就会造成内存泄漏。 二、几个关于动态内存的经典例题 例题1、代码运行结果是什么 源代码 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; } 问这段代码运行结果会是什么呢 例题1解答 一是没有释放动态内存 二是会产生这样的错误 原因是因为在Test函数中把str指针置空然后作为参数传给GesMemory函数该函数形参用指针p接收这样指针p也为NULL然后给指针p动态开辟空间函数结束到strcpy函数但我们注意我们是给指针p开辟空间但指针str是没有变的很多伙伴想不清楚这不是传址调用吗p指针变了str指针也应该跟着变呀 实则不然我们应该注意参数是指针也不一定是传址调用这里是指针之间赋值应该同时上升一段层次这里要二级指针才算传址调用所以指针str是不会变的还是NULL既然是NULL所以就没有足够的空间能放下strcpy的第二个参数所以报错。 例题2、代码运行结果是什么 char* GetMemory(void) {char p[] hello world;return p; } void Test(void) {char* str NULL;str GetMemory();printf(str); }int main() {Test();return 0; } 问这段代码运行结果是什么 例题2解答 会产生这样的结果 “很多小伙伴可能觉得在GetMemory函数里面返回字符串的起始地址p所以在Test函数里面用指针str来接收并打印所以运行结果应该为打印字符串。” 但实则不然我们一定要注意每个变量的生命周期数组p的生命周期就只在函数GetMemory里面所以当该函数return后里面的变量所占的空间都会被自动销毁释放既然p的空间已经被释放了还赋值给指针str所以str就是个野指针再打印str就造成非法访问内存了。 这类问题属于返回栈空间地址的问题。 三、C/C程序的内存开辟 如下图 C/C 程序内存分配的几个区域 1. 栈区 stack 在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中效率很高但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。 2. 堆区 heap 一般由程序员分配释放 若程序员不释放程序结束时可能由 OS 回收。分配方式类似于链表。 3. 数据段静态区 static 存放全局变量、静态数据。程序结束后由系统释放。 4. 代码段存放函数体类成员函数和全局函数的二进制代码。 实际上普通的局部变量是在 栈区 分配空间的栈区的特点是在上面创建的变量出了作用域就销毁。但是被static 修饰的变量存放在 数据段静态区 数据段的特点是在上面创建的变量直到程序 结束才销毁 所以生命周期变长。 四、柔性数组 一、柔性数组的概念 也许你从来没有听说过 柔性数组 flexible array 这个概念但是它确实是存在的。 C99 中结构中的最后一个元素允许是未知大小的数组这就叫做『柔性数组』成员。 如下 //定义一 struct S {int a;int arr[0]; }; //定义二 struct B {int a;char b;int arr[]; }; 二、柔性数组的特点 1、 结构中的柔性数组成员前面必须至少一个其他成员。 2、 sizeof 返回的这种结构大小不包括柔性数组的内存即sizeof只计算柔性数组前面的成员的大小。 3、 包含柔性数组成员的结构用 malloc () 函数进行内存的动态分配并且分配的内存应该大于结构的大 小以适应柔性数组的预期大小。 三、柔性数组的使用 如下例 struct S {int a;int arr[]; };int main() {//动态开辟了440个字节,因为柔性数组是不会被sizeof计算的//前面四个字节是给成员a的后面四十个字节给柔性数组//因为柔性数组的大小是未知的我们只需给出预期大小struct S* str (struct S*)malloc(sizeof(struct S) 40);//检查if (str NULL){perror(malloc);return 1;}//使用str-a 10;int i 0;for (i 0; i 10; i){str-arr[i] i 1;//printf(%d , str-arr[i]);}//用realloc扩容因为柔性数组大小未知是可以改变的//将之前柔性数组的10个字节的大小扩容到15个struct S* p (struct S*)realloc(str, sizeof(struct S) 60);//检查if (p NULL){perror(realloc);return 1;}//使用str p;for (i 10; i 15; i){str-arr[i] i 1;}//打印for (i 0; i 15; i){printf(%d , str-arr[i]);}//释放free(str);str NULL;return 0; } 用malloc函数进行开辟空间用realloc函数进行扩容这样数组的大小就是可变的、柔性 的这就是柔性数组的特点。 四、柔性数组的优势 1.方便内存释放 如果我们的代码是在一个给别人用的函数中你在里面做了二次内存分配并把整个结构体返回给用户。用户调用free 可以释放结构体但是用户并不知道这个结构体内的成员也需要 free 所以你不能指望用户来发现这个事。所以如果我们把结构体的内存以及其成员要的内存一次性分配好了并返回给用户一个结构体指针用户做一次free 就可以把所有的内存也给释放掉。 2.这样有利于访问速度 连续的内存有益于提高访问速度也有益于减少内存碎片。其实我个人觉得也没多高了反正你跑不了要用做偏移量的加法来寻址。
http://www.hkea.cn/news/14424948/

相关文章:

  • php网站开发常用框架wordpress主题贴吧
  • 珠海网站建设 骏域网站网站权重传递
  • 樟树市建设局网站儋州网站设计公司
  • 做公众号的软件电商seo搜索引擎优化
  • 网站开发怎么拉客户网页设计师课程
  • 中企动力合作网站做短租类型的网站
  • 自建站shopify做视频网站的公司
  • 购物网站用那个软件做开发小程序费用
  • 淘金企业网站建设服务开发公司与物业公司移交协议
  • 罗湖附近公司做网站建设哪家服务周到河北建设网官方网站
  • 在哪个网站开发外贸业务做一个京东网站怎么做的
  • 建设网站服务wordpress新建文章中添加目录
  • 做网站最简单的工具什么是网站外部链接
  • 网站开发工资东莞网站平台后缀
  • 手机上传网站源码横琴高新区最新
  • 西部数码网站管理助手 mysql保存路径优化关键词有哪些方法
  • 境外网站搭建网站开发流行语言
  • wordpress 建视频网站吗网站的模板演示怎么做
  • 重庆做兼职哪个网站上海人才网官网登录不进去
  • 美食网站建设方案seo关键词排名优化软件
  • 广州专业建网站公司东莞建设网住房保障专栏
  • 网站定位案例wordpress 分类下文章
  • 买源码做网站简单嘛宁波市网站建设制作费用
  • 网站做游戏活动策划方案房屋设计软件app哪个好
  • 网站 功能呢西安网站建设制作价格
  • 政务网的门户网站建设企业官网如何设计
  • 长安网站建设推广公司商店小程序
  • 衡水 网站建设姓氏网站建设的意见和建议
  • 石家庄科技网站深圳英文网站建设公司
  • 网站建设方案书安全性嘉兴建设中学网站