内存的管理方式

1、内存的区域

    对于内存的区域划分上,不同的区域划分上都各有不同。

划分1:

代码区、堆、栈、 全局区(静态存储区)、 文字常量区、

划分2:

代码段、堆、栈、  data段、BSS段、文字常量区

全局区:

    又成为静态存存储区。保存的是全局变量和静态变量(带有static 关键字)。全局区分为两个区域:一个区域保存的是经过初始化,且初始化的值不为零的全部变量和静态变量;一个区域保存的是没有经过初始化或者初始化的值为零的。程序结束由 OS 进行释放

常量区:

    将一些不可以被更改的只读的常量进行保存的区域。比如文字字符串等。程序结束之后由系统释放。

代码区:

    保存的是二进制代码的区域。

堆:

    由程序猿手动 malloc/free进行开辟的空间,一般也是由程序猿调用 free/delete 进行释放,即使没有进行释放,也可以由 OS 进行释放。

栈:

    程序运行的时候由编系统进行分配,存在函数的的局部变量等。程序结束由系统自动释放。

DATA段:

    有经过初始化的全局变量和静态变量存储的区域,当然初始值不能为零

BSS段:

    保存的是没有经过初始化的全局变量和静态变量存储的区域,或者经过初始化但是初始值为零的也保存在这个区域。

注意:很显然,DATA 段和 BSS 段的也行,其实就是全局区(静态存储器)内部之一,DATA 段和 BSS 段只不过是全局区更加精细的划分。

解释:

    借助前人总结的知识:

int a = 0;            全局初始化区  
char *p1;          全局未初始化区  
main()  
{  int b;                          //char s[] = "abc";      //char *p2;                  //char *p3 = "123456";          //"123456/0"在常量区,p3在栈上。   static int c =0//全局(静态)初始化区  p1 = (char *)malloc(10);  p2 = (char *)malloc(20);  //分配得来得10和20字节的区域就在堆区。  strcpy(p1, "123456");         // 123456 放在常量区,编译器可能会将它与p3所指向的"123456"                              //优化成一个地方。   
}

 

2、内存的三种来源:栈、堆、全局区

栈:

    (1)运行时候由编译器自动分配自动回收,这一切都是自动的,程序猿不用管理

    (2)反复使用:每一个进程,操作系统都会为这个进程分配栈,这个进程不论是怎么出入栈,都是在这个栈,反复使用。

    (3)脏内存:栈内存由于反复的使用,程序使用完毕之后不会去做清理的工作,所以重新使用栈的时候,值就是脏的。

    (4)临时性:局部变量的出栈入栈,每次都是不一样,所以都是临时性的,所以,绝对不要返回栈变量的指针,因为栈地址都是临时的,

    (5)栈溢出:因为栈的大小是操作系统设定的,当出现无线递归或者出现巨大的局部变量。

堆:

    (1)大块内存:栈的空间非常有限,所以当需要需要大块内存的时候,就在堆进行申请,

    (2)手动申请、释放: 使用 malloc/new 申请,free/delete 进行释放。

    (3)脏内存 : 堆内存也是被反复使用的

malloc 实际应用:

    操作系统会对空闲的内存块进行组织管理,而这种组织管理的方式是以链表的形式。当程序猿调用 malloc 的时候就从空闲的链表找出一块大小满足申请要求的空间(可以比用户申请的大),然后将这个内存空间一分为二:一部分是用户申请空间的大小,另外的部分是维护链表这个节点的基本信息(比如地址、块内存的大小)。所以当 malloc 的时候,不论申请的空间是多大,都必须申请一块用于维护链表的空间。

#include <stdio.h>
#include<stdlib.h>
int main(void)
{int i,j;FILE * fp = fopen("qxj511.txt", "w");for ( i = 0; i < 2048; i++){int *p1 = (int *)malloc(i);int *p2 = (int *)malloc(i);fprintf(fp, "i =%d : p1 = %d, p2 = %d,\n",i, p1, p2);free(p1);free(p2);        }fclose(fp); /*关闭文件*/
}

    在 gcc 的编译器下面做的测试,

i =0 : p1 = 151765360, p2 = 151765376,    // 1
i =1 : p1 = 151765376, p2 = 151765360,
i =2 : p1 = 151765360, p2 = 151765376,
i =3 : p1 = 151765376, p2 = 151765360,
i =4 : p1 = 151765360, p2 = 151765376,
i =5 : p1 = 151765376, p2 = 151765360,
i =6 : p1 = 151765360, p2 = 151765376,
i =7 : p1 = 151765376, p2 = 151765360,
i =8 : p1 = 151765360, p2 = 151765376,
i =9 : p1 = 151765376, p2 = 151765360,
i =10 : p1 = 151765360, p2 = 151765376,
i =11 : p1 = 151765376, p2 = 151765360,
i =12 : p1 = 151765360, p2 = 151765376, // 1 
i =13 : p1 = 151765392, p2 = 151765416, // 2
i =14 : p1 = 151765416, p2 = 151765392,
i =15 : p1 = 151765392, p2 = 151765416,
i =16 : p1 = 151765416, p2 = 151765392,
i =17 : p1 = 151765392, p2 = 151765416,
i =18 : p1 = 151765416, p2 = 151765392,
i =19 : p1 = 151765392, p2 = 151765416,
i =20 : p1 = 151765416, p2 = 151765392,
i =21 : p1 = 151765440, p2 = 151765472,
i =22 : p1 = 151765472, p2 = 151765440, // 2
。。。。。。。

    经过笔者的测试,当 申请的的空间,从零到12个字节的时候,两者的差是16个字节,后序申请的全部的空间差是 8 个字节。也就是说,实际申请的空间是链表头部 + 申请的空间,同时,8 个字节是处于内存对齐。

参考 : http://blog.csdn.net/misskissc/article/details/17717717

    (1)malloc(0) :

If size is  0,  thenmalloc()  returns either NULL, or a unique pointer value that can later be successfully passed to free().

根据官方的解释,当申请的空间为零的时候,返回值要么是为 NULL,要么就可以正确返回一个地址,这个地址被正确释放。但是实际上,都是返回后者。

    根据 malloc 的实现方式,虽然申请的空间为零,但是链表的指针也是会被申请一段空间的,所以可以正确申请,空间为 16 字节(maybe 8字节) + 0; 而这个链表指针地址其实就是 malloc 的返回值的地址。

注意: 对于链表维护空间的大小是16 字节,这个是不确定的,有人说是8个字节,

malloc 与 sizeof:

    使用 malloc 是申请了一个程序猿指定的空间,返回值是指向这段空间的的首地址。想要计算这段申请空间的大小,是不可以通过 sizeof 计算出来的:

int *p = (int *)malloc(10 * sizeof(int));
printf("%d\n", sizeof(p));

 

打印出来:

等于4

    原因分析,p 是指向申请空间的首地址,也就是说这个是地址,对于指针来说,不论指向的空间是多大,指针占据的就是四个字节。所以,sizeof 是不能计算 malloc。

转载于:https://www.cnblogs.com/qxj511/p/4933705.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英语四六级和计算机二级是一,大学里最难考证书排名,四六级和计算机根本排不进前三...

大学是我们提高自身技能最好的一个时期&#xff0c;除了平时的课程和一些社团活动之外&#xff0c;还有一件最最必不可少的事情&#xff0c;那就是考证&#xff0c;而这也是为我们以后工作打好基础&#xff0c;为自己多准备一些敲门砖。我国各个行业都有属于自己的证书&#xf…

Scrapy爬虫中的链接提取器LinkExtractor

今天在编写Scrapy爬虫的时候接触到了LinkExtractor&#xff0c;遂学习了一下这个链接提取器。 Link Extractors 是那些目的仅仅是从网页(scrapy.http.Response 对象)中抽取最终将会被follow链接的对象&#xff61;使用场景就是在一个网站中通过自定义规则提取到自己想要的那些网…

Fedora 安装后需要做的第一件事

一直以来&#xff0c;Red Hat 系的许多教程&#xff0c;都会建议你关闭 SELinux。确实&#xff0c;启用 SELinux 可能会造成许多莫名其妙的错误。但在实际生产环境&#xff0c;甚至是用户工作站&#xff0c;Red Hat 都建议将 SELinux 设为 enforcing 模式&#xff0c;因为它在关…

html文件怎么导出stl文件,各种3D建模软件导出STL文件的小技巧(一)

很多用户在提交3D模型文件的时候&#xff0c;常常有这样的困惑&#xff1a;什么是STL 格式文件&#xff0c;怎么获取STL 格式文件呢&#xff1f;STL 格式文件是在计算机图形应用系统中&#xff0c;用于表示三角形网格的一种文件格式。它也是3D打印机在执行3D打印程序时&#xf…

angularjs 中的scope继承关系——(2)

转自&#xff1a;http://www.lovelucy.info/understanding-scopes-in-angularjs.html angularjs 中的scope继承关系 ng-include 假设在我们的 controller 中&#xff0c; $scope.myPrimitive 50; $scope.myObject {aNumber: 11}; HTML 为&#xff1a; <script type&quo…

C# DatatTable某一列是否有重复判断

public bool HasRepeatData(DataTable dt,string[] colName) { bool flagfalse; DataView myDataView new DataView(dt); if (myDataView.ToTable(true, colName).Rows.Count < dt.Rows.Count) { flag true; } return flag; }转载于:https://www.cnblogs.com/clj0102/p/93…

cordova 项目添加splash启动界面

需求&#xff1a;cordova项目启动添加启动界面&#xff0c;并在设备初始化完成后自动隐藏splash1.新建项目cordova create Mypro com.test.pro proName2.添加平台cd Mypro&#xff08;进入目录&#xff09;cordova platform add androidcordova platform add iOS3.添加splash插…

辽宁大学计算机专业接收调剂,目前有计算机专业调剂通知的学校,不断更新—3月26日更新,新增辽宁大学等...

本帖最后由 yunnyforo 于 2012-3-26 21:16 编辑注&#xff1a;我对研究所关注度不高&#xff0c;关于研究所的调剂通知可能不及时&#xff0c;见谅。大家可以关注中国教育在线考研调剂信息站&#xff1a;http://kaoyan.eol.cn/html/ky/tiaoji/index.shtml&#xff0c;个人感觉这…

Android界面菜单(4)—快捷菜单

2019独角兽企业重金招聘Python工程师标准>>> 快捷菜单 当用户点击界面上某个元素超过2秒后&#xff0c;将启动注册到该界面的快捷菜单。 步骤&#xff1a; 1.代码动态生成菜单 final static int CONTEXT_MENU_1 Menu.FIRST;final static int CONTEXT_MENU_2 Menu…

Echarts地图编写

1.引入echarts库文件 <script charset"utf-8" type"text/javascript" language"javascript" src"echarts-2.2.7/doc/example/www/js/echarts.js"></script> 2.在页面中新建div用于地图展示 <div id"main" st…

迷宫游戏 堆栈实现

#include<iostream> #include<string> #include<stack> using namespace std; #define n 8stack <int *> s;int * createMaze(){//初始化迷宫int i,j;int * a;anew int[n*n];for(i0;i<n;i){for(j0;j<n;j){*(an*ij)-1;//不设置为0的原因是超过矩阵…

威海职业学院计算机专业宿舍,2021年威海职业学院新生宿舍条件和宿舍环境图片...

每年高考结束后&#xff0c;威海职业学院新生被录取同学们陆续都到校报到~而宿舍作为同学们朝夕相处之场所&#xff0c;如果不懂相处之道&#xff0c;难免会摩擦不断&#xff0c;更有甚者堪比宫斗大戏。所以各位大学新生一定要珍惜室友之间的友情&#xff0c;彼此处好关系。本文…

PostgreSQL 函数调试、诊断、优化 auto_explain

PostgreSQL 函数调试 & auto_explain 作者 digoal 日期 2016-11-21 标签 PostgreSQL , pldebugger , 函数调试 , auto_explain 背景 PostgreSQL的服务端编程能力比较强&#xff0c;不仅支持像java, R, python这种流行的编程语言&#xff0c;另外还内置了一个与Oracle plsql…

判断请求来自手机还是PC

由于小程序和PC端用的是同一个后台 所以就需要判断请求是从哪里发过来的 在这里是利用Request Body 里面的user-agent 来判断 /** * 根据当前请求的特征&#xff0c;判断该请求是否来自手机终端&#xff0c;主要检测特殊的头信息&#xff0c;以及user-Agent这个header * * pa…

小旭的互联网营销之微信营销

11月1日&#xff0c;一篇题为《什么样的女黑客竟遭马云强东在双11联手封杀?》的文章&#xff0c;借助双11火热的关注效应&#xff0c;在短短两天时间内刷爆朋友圈。 该文章的女主角不仅外表靓丽&#xff0c;黑客技术更是惊艳&#xff1a;“作为美籍华人的Joanna在2015黑帽子会…

计算机专业录取分数及大学排名,计算机专业录取分数最高的大学有哪些?附排名前50大学名单...

高考结束之后&#xff0c;不少即将迎接高考的家长对于很多专业的录取情况都抱有很大的兴趣&#xff0c;都比较关心自己的理想专业大概能上哪些大学。今天&#xff0c;小编将为大家以山东高考计算机专业各大学录取分数进行排名&#xff0c;供下一届高考生参考。计算机专业作为近…

letsencrypt 自动续期不关闭nginx

为什么80%的码农都做不了架构师&#xff1f;>>> 已失效 corntab -e 5 0 1 * * /opt/letsencrypt/letsencrypt-auto --config /etc/letsencrypt/webroot.ini -d <domain> certonly && sudo service nginx reload/etc/letsencrypt/webroot.ini rsa-key…

loss低但精确度低_低光照图像增强网络-RetinexNet(model.py解析【2】)

论文地址&#xff1a;https://arxiv.org/pdf/1808.04560.pdf代码地址&#xff1a;https://github.com/weichen582/RetinexNet解析目录&#xff1a;https://zhuanlan.zhihu.com/p/88761829整个模型架构被实现为一个类&#xff1a;class lowlight_enhance(object):其构造函数实现…

计算机应用发表论文,计算机应用论文发表.docx

计算机应用论文发表1在工程项目管理中应用计算机技术存在的问题计算机软件是计算机运行的重要保障&#xff0c;一个好的计算机软件直接决定计算机技术在工程项目管理的高效应用。但由于市场上计算机软件种类繁多&#xff0c;质量好坏不一&#xff0c;质量好的价格高&#xff0c…

添加dubbo xsd的支持

使用dubbo时遇到问题&#xff1a; org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document http://code.alibabatech.com/schema/dubbo/dubbo.xsd, because 1) could not find the document; 2) the document could not be read; 3) the root ele…