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

做英文网站2014wordpress 景点模板

做英文网站2014,wordpress 景点模板,企业建网站开发,制作自己的网站目录 前言 一、动态内存管理 二、动态内存函数 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 三、动态内存常见的6个使用错误 3.1 接收malloc/calloc返回的参数后未及时检查是否为NULL 3.2 越界访问动态内存空间 3.3 对非动态开辟的内存使用free释放 3.4 使用free只释放了…目录 前言 一、动态内存管理 二、动态内存函数 2.1 malloc  2.2 free 2.3 calloc 2.4 realloc 三、动态内存常见的6个使用错误 3.1 接收malloc/calloc返回的参数后未及时检查是否为NULL 3.2 越界访问动态内存空间 3.3 对非动态开辟的内存使用free释放 3.4 使用free只释放了动态开辟内存的一部分 3.5 对同一块动态内存多次释放 3.6 动态开辟内存忘记释放造成内存泄露 四、动态内存经典笔试题 4.1 题目1 4.2 题目2 4.3 题目3 4.4 题目4 五、柔性数组 六、C/C中程序内存区域划分 前言 本篇主要讨论以下问题 动态内存基础知识点 1. 为什么会出现动态内存的概念 2. 与动态内存有关的4个函数它们分别的作用、函数的参数、返回类型以及要注意的地方是什么 3. 知道动态开辟的内存是在堆区开辟空间的如果不主动使用free释放开辟的动态内存空间那么只能等程序结束后由操作系统释放了。(不可取一定要记得自己用free去释放) 动态内存避坑指南 4. 动态内存开辟和使用过程中常见的有哪6大错误 5. 动态内存经典笔试题找出代码中错误的点 柔性数组 6. 怎样的数组才能被称为柔性数组含柔性数组的结构体是如何开辟内存空间的又是如何找到结构体变量的成员变量的 了解内存有哪几个重要的区域 7.内存有哪几个重要的区域 一、动态内存管理 1. 在没有学习动态内存管理前 我们知道的为变量开辟内存的方式有两种① 一次申请一个变量的空间 ② 一次申请一块连续的空间但这两种申请内存空间的方式有一个明显的缺点就是申请的空间大小一旦确定就无法更改了于是C语言中引入了动态内存的概念我们可以利用4个与动态内存有关的函数实现动态开辟内存空间。 二、动态内存函数 1. 4个与动态内存有关的函数所需的头文件都是stdlib.h。 2.1 malloc  1. malloc函数的作用开辟size字节的动态内存空间。 2. 语法形式void* malloc (size_t size)     size_t size表示向堆区一次性申请几个字节的空间。     void*返回类型之所以是void*(void*可接收任意类型的地址)是因为malloc只知道向内存的堆区申请几个字节的空间并不知道将会存放什么类型的数据但是程序员是知道的所以在用malloc开辟动态内存后一般会立即强制类型转换直接用其他类型的指针变量接收。 3. 如果malloc开辟内存成功则返回一个指向开辟好空间的指针。     如果malloc开辟内存失败则返回一个NULL指针因此在用指针接收malloc返回的地址后需要检查指针内的地址是否为NULL。 4. 如果malloc函数的参数size为0这是标准未定义的完全取决于编译器如何处理。 #include stdio.h #include stdlib.h int main() {//开辟动态内存int* ps (int*)malloc(10 * sizeof(int));//强制转换后再接收if (ps NULL)//判断是否开辟失败{perror(malloc);return 1;//异常返回返回非0}return 0; } 2.2 free 1. free函数的作用用于回收malloc/calloc/realloc开辟的动态内存空间。 2. 语法形式void free (void* ptr)     void* ptr表示指向malloc/calloc/realloc开辟的动态内存空间的指针。 3. free函数只是回收了ptr所指向的动态内存空间但此时ptr中仍然存放着指向刚刚已被回收的动态内存空间的地址因此在使用free函数后应立即在后面一行中写上将ptr置NULL的操作防止ptr野指针被使用。 4. 如果free函数的参数 ptr 指向的空间不是动态开辟的内存空间这是标准未定义的完全取决于编译器如何处理。     如果free函数的参数是NULL则free函数将什么都不会做。 #include stdio.h #include stdlib.h int main() {//开辟动态内存int* ps (int*)malloc(10 * sizeof(int));//强制转换后再接收if (ps NULL)//判断是否开辟失败{perror(malloc);return 1;//异常返回返回非0}//使用动态内存//释放动态内存free(ps);ps NULL;return 0; } 2.3 calloc 1. calloc函数的作用为num个大小为size字节的元素开辟一块动态内存空间 与malloc不同的是calloc会对开辟的空间每个字节都初始化为0。 2. 语法形式void* calloc (size_t num, size_t size)     size_t mun表示要分配的元素个数。     size_t size表示每个元素的大小。     void*和malloc函数的原因一致在用calloc开辟动态内存后一般会立即强制类型转换直接用其他类型的指针变量接收。 3. 如果calloc开辟内存成功则返回一个指向开辟好空间的指针。     如果calloc开辟内存失败则返回一个NULL指针因此在用指针接收malloc返回的地址后需要检查指针内的地址是否为NULL。 #include stdio.h #include stdlib.h int main() {//开辟动态内存int* ps (int*)calloc(10, sizeof(int));//强制转换后再接收if (ps NULL)//判断是否开辟失败{perror(calloc);return 1;//异常返回返回非0}//使用动态内存,看看calloc默认初始化的值for (int i 0; i 10; i){printf(%d , *(ps i));//屏幕上打印出了10个0}//释放动态内存free(ps);ps NULL;return 0; } 2.4 realloc 1. realloc函数的作用调整用malloc/calloc/realloc开辟过的动态内存空间大小。 2. 语法形式void* realloc (void* ptr, size_t size)     void* ptr表示指向malloc/calloc/realloc开辟的动态内存空间的指针。     size_t size表示想要重新调整到的动态内存空间的大小。     void*和malloc函数的原因一致在用calloc开辟动态内存后一般会立即强制类型转换直接用其他类型的指针变量接收。 3. 如果realloc调整内存大小成功则返回非NULL指针。     如果realloc调整内存大小失败则返回一个NULL指针此时如果直接用ptr接收realloc返回的地址会使得ptr连原本的动态内存空间都无法找到也无法将原本的动态内存空间释放所以在用realloc调整动态内存空间后不会直接用ptr接收而是会建立一个临时指针去接收临时的指针接收后判断如果临时指针不为NULL则把临时指针内的地址赋值给ptr并把临时的指针赋值为NULL如果为NULL则进行报错。 4. 关于realloc函数返回的地址是什么的问题     情况一原有空间之后有⾜够⼤的空间可以扩充此时要扩展内存就直接会在原有内存之后直接追加空间原来空间的数据不发⽣变化realloc返回的地址值与ptr内的值一致。     情况二原有空间之后没有⾜够⼤的空间可以扩充扩展的⽅法是在堆空间上另找⼀个合适⼤⼩的连续空间来使⽤同时把旧数据拷贝到新的空间并释放旧的空间这样函数返回的是⼀个新的内存地址。 5. realloc函数的隐藏技能如果realloc函数的参数void* ptr部分传参为NULL效果等同于malloc函数。 #include stdio.h #include stdlib.h int main() {//开辟动态空间int* ps (int*)malloc(10 * sizeof(int));if (ps NULL){perror(malloc);return 1;}//调整动态空间int* ps2 (int*)realloc(ps, 20 * sizeof(int));if (ps2 ! NULL){ps ps2;ps2 NULL;}else{perror(realloc);return 1;}//释放动态内存free(ps);ps NULL;return 0; } 三、动态内存常见的6个使用错误 3.1 接收malloc/calloc返回的参数后未及时检查是否为NULL #include stdio.h #include stdlib.h int main() {int* p (int*)malloc(10 * sizeof(int));*p 20;//errreturn 0; } 3.2 越界访问动态内存空间 #include stdio.h #include stdlib.h int main() {//开辟动态内存空间int* p (int*)malloc(10 * sizeof(int));if (p NULL){perror(malloc);return 1;}//使用for (int i 0; i 12; i){*(p i) i;//err}//释放动态内存空间free(p);p NULL;return 0; } 3.3 对非动态开辟的内存使用free释放 #include stdio.h #include stdlib.h int main() {int a 10;int* pa a;free(pa);//errpa NULL;return 0; } 3.4 使用free只释放了动态开辟内存的一部分 #include stdio.h #include stdlib.h int main() {//开辟动态内存空间int* p (int*)malloc(10 * sizeof(int));if (p NULL){perror(malloc);return 1;}//使用动态空间for (int i 0; i 5; i){*p i;p;}//释放动态内存空间free(p);//errp NULL;return 0; } 3.5 对同一块动态内存多次释放 #include stdio.h #include stdlib.h int main() {//开辟动态内存空间int* p (int*)malloc(10 * sizeof(int));if (p NULL){perror(malloc);return 1;}//使用动态空间free(p);p NULL;//释放动态内存空间free(p);//errp NULL;return 0; } 3.6 动态开辟内存忘记释放造成内存泄露 #include stdio.h #include stdlib.hvoid Test() {int* p (int*)malloc(100);if (p NULL){perror(malloc);return 1;}else{*p 20;}//err,未释放动态内存 }int main() {test();return 0; } 四、动态内存经典笔试题 4.1 题目1 题目分析代码的目的是想让字符串拷贝到动态开辟的内存中。 错误分析① 采用了传值调用改变形参实参不受影响。                   ② NULL不能被使用。                   ③ 没有free动态内存。 #include stdio.h #include stdlib.hvoid GetMemory(char* p) {p (char*)malloc(100); }void Test(void) {char* str NULL;GetMemory(str);//传值调用strcpy(str, hello world);//strNULLerrprintf(str); }int main() {Test();return 0; } //修改代码 #include stdio.h #include stdlib.hvoid GetMemory(char** p) {*p (char*)malloc(100);if (*p NULL)//{perror(malloc);} }void Test(void) {char* str NULL;GetMemory(str);//strcpy(str, hello world);printf(str);free(str);//str NULL;// }int main() {Test();return 0; } 4.2 题目2 错误分析① 自定义函数返回了局部变量的地址 #include stdio.h #include stdlib.hchar* GetMemory(void) {char p[] hello world;//err//static char p[] hello world;//修改代码将上一行替换return p; }void Test(void) {char* str NULL;str GetMemory();printf(str); }int main() {Test();return 0; } 4.3 题目3 错误分析① 没有判断malloc是否返回的NULL                   ② 没有用free释放动态内存空间 #include stdio.h #include stdlib.hvoid GetMemory(char** p, int num) {*p (char*)malloc(num); }void Test(void) {char* str NULL;GetMemory(str, 100);strcpy(str, hello);printf(str); }int main() {Test();return 0; } //修改代码 #include stdio.h #include stdlib.hvoid GetMemory(char** p, int num) {*p (char*)malloc(num);if (*p NULL)//{perror(malloc);} }void Test(void) {char* str NULL;GetMemory(str, 100);strcpy(str, hello);printf(str);//free(str);//str NULL; }int main() {Test();return 0; } 4.4 题目4 错误分析① 没有判断malloc是否返回的NULL                   ② free后没有及时将str置NULL #include stdio.h #include stdlib.hvoid 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; } //修改代码 #include stdio.h #include stdlib.hvoid Test(void) {char* str (char*)malloc(100);if (str NULL){perror(malloc);return 1;}strcpy(str, hello);free(str);str NULL;//无意义代码if (str ! NULL){strcpy(str, world);printf(str);} }int main() {Test();return 0; } 五、柔性数组 1. C99中结构体至少2个成员变量若最后一个成员变量是一个未知大小的数组则这个数组叫做柔性数组。 未知大小的数组写法① int arr[]; ② int arr[0]; 2. 柔性数组的特点 ① 结构体中柔性数组成员前必须至少有1个其他成员变量。 ② sizeof计算含柔性数组的结构体大小时计算的结果不包含柔性数组的大小因为柔性数组的大小是未知的。 ③ 包含柔性数组的结构体在申请内存空间时要采用动态内存开辟的方式并且开辟的动态内存空间应大于结构体内存的大小以适应柔性数组的预期大小总之在创建有柔性数组的结构体变量时不要采用struct St s传统的方式这样创建的结构体变量中柔性数组成员变量是没有大小的我们应采用 struct St* p (struct St*) malloc(sizeof(struct St)10* sizeof(int)类似的方式创建结构体变量找结构体成员变量时直接用(-)操作符即可这种写法下相当于不同的结构体指针变量代表着不同的结构体变量) 3. 使用动态内存为含柔性数组的结构体开辟空间的方式而不用平常为结构体变量开辟空间的方式的好处① 方便内存释放 ② 访问数组相对较快 ③ 利于减少内存碎片(动态内存之间未利用到的内存) #include stdio.h #include stdlib.hstruct St {float a;int arr[0]; };int main() {struct St* p (struct St*)malloc(sizeof(struct St) 10 * sizeof(int));if (p NULL){perror(malloc);return 1;}//使用scanf(%f, (p-a));printf(%f, p-a);for (int i 0; i 10; i){scanf(%d, (p-arr[i]));printf(%d , p-arr[i]);}//释放free(p);p NULL;return 0; } 六、C/C中程序内存区域划分 本篇文章已完结谢谢支持
http://www.hkea.cn/news/14334858/

相关文章:

  • 信用网站标准化建设什么软件网站好
  • 国家重大建设项目网站地址广东省建设教育协会是什么网站
  • 大型网站开发文档上海医疗网站建设
  • 站长必备网站网络协议分析课程设计报告
  • 网络推广建立站点如何建立如何做视频播放网站
  • 农业电商网站建设方案网站建设教程l
  • 网站建设ppt广州网站建设海珠信科
  • 丰台网站制作做啥网站赚钱
  • 无锡哪里有做网站微信公众号平台建立
  • 镇江网站建设价格企业自助建站软件
  • 做音乐网站要多少钱一学一做看视频网站有哪些
  • 成品网站建站空间介绍几个能进去的a站
  • 网站建设思维导图的要求酒店网站的设计摘要
  • 国家城乡建设部网站首页蒙阴网站优化
  • 资源丰富免费的网站推荐排名做啪啪网站
  • 亚马逊云服务 网站建设外包的工作值得做吗
  • seo网站优化价格公司名称变更说明函
  • ipv6改造网站怎么做ppt模板大全app
  • 网站运营管理报告总结网站建设教学视频教程
  • 上海手机网站建设方案作者简介网页制作模板
  • 租房平台网站开发qq推广功能在哪开
  • 网站的系统帮助重庆市网络营销推广
  • 注册公司3个人分别是啥珠海网站推广优化
  • 网站搭建怎么收费呀做设计 素材网站有哪
  • 一个人做网站要多久软件公司简介内容怎么写
  • 塘沽企业网站建设做汇算清缴在哪个网站下
  • 大型网站开发的主流语言阿里云 wordpress 博客
  • 网站建设 有限公司儿童教育机构网页设计素材
  • 关于做网站ppt做调差问卷的网站
  • 手表网站欧米茄价格网站开发选择什么软件