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

诸城网站建设多少钱找项目网

诸城网站建设多少钱,找项目网,手机网站制作大约多少钱,四平市住房和城乡建设局网站接上一篇文章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.dnsts.com.cn/news/133943.html

相关文章:

  • 在手机上自建网站怎么弄专做艺术圈的网站
  • 网站建设 7 24企业英文网站制作
  • 网站开发和网页开发有什么区别成品源码1688网站免费
  • 深圳 公司网站设计高端外贸建站
  • 三只松鼠的网站建设理念河北省建设机械会网站首页
  • 网站维护基础知识WordPress简约资讯主题
  • 西安做百度推广网站 怎样备案沪江博客wordpress模板
  • 网站建设与管理中专服务器多少钱
  • wordpress php7主题外贸seo建站
  • 龙岗网站建设推广报价wordpress系统升级的风险
  • 建设好网站短视频分享网站开发
  • 网站 测速度专业免费网站建设
  • 免费文档网站网站开发的价格
  • 用yii框架做的网站如何搭建html网页生成
  • 网站显示搜索框零基础学pytho 网站开发
  • 域名解析后网站怎么建设制作网站要花多少钱如何
  • 聪明的上海网站seo推广公司有哪些
  • 关键词网站排名顾问下载百度2024最新版
  • 网站建设咨询哪家性价比高团购的网站扣佣金分录怎么做
  • 晋州住房保障建设局网站中国传统色彩网站建设方案
  • 移动端快速建站网页游戏大全排行
  • 网站模板安全管理系统短视频关键词seo优化
  • 包头建设局网站网站管理员怎样管理员权限
  • 美容院网站源码网站模板文件的名字
  • 极速网站推广专家贵阳网站建设公
  • 做视频教学网站excel可以做网站吗
  • 域名到期与网站打不开百度推广的优化软件
  • 佛山 网站设计公司做动态图表的网站
  • 文山州中小企业网站建设中英文外贸网站模板 生成静态html
  • 做网站后台开发工资主流网站 技术