电场、磁场都是实际存在的物质,这些物质我们看不见摸不着,当它们出现时,我们都认为理所当然,而不会对其背后的理论与原理进行深究,我们追求的是实用性和帮我们解决问题。计算机也是如此,当汇编语言和图形界面出现之前,操作和使用计算机是少部分专业人的专利,与我们芸芸众生相隔甚远。而当计算机走入寻常生活时,哪怕我们对计算机一无所知,也不妨碍我们通过图形界面使用应用软件和操作计算机,我们只关心具体的术、而不在乎形而向上的道。

但是对于一个开发者来说,我们只有在充分理解计算机背后的”道“基础上,才能做到对具体术的游刃有余。而这个修道的过程,恰恰是我们成长的过程。

计算机中有很多概念,计算机的学习实际是对概念的学习。看书阅读是最基本的方式,但是最重要的还是需要自己动手练习和做项目,对于成年人来说,没有什么比任务式学习更有效。下面对内存五区进行简单说明,希望以后能够和大家互相讨论,共同进步,毕竟终生学习不是口号,而是已经走近现实。
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆非常相似,不过他们是通过free的方式释放内存。

全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

一个典型程序的执行过程如下:

上图来自网络

一个函数的执行过程如下:
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *getStrl()
{
char *p1=“abcde”;
return p1;
}
char *getStr2()
{
char *p2=“abcde”;
return p2;
}
void main(){
char *p1=NULL;
char *p2=NULL;
p1 =getStrl();
p2 =getStr2();
printf(“p1:%s,p2:%s \n”,p1,p2);
printf(“p1:%d,p2:%d \n”,p1,p2);
system(“pause”);
return;
}
运行结果: p1:abcde,p2:abcde p1:3972,p2:3972
指针是编程语言中的重要概念,通常一个人对指针的理解程度能够从侧面反映出他对一门编程语言的熟悉程度。关于指针,要记住和理解一下两个结论:

1,指针指向谁,就把指向对象的地址赋给指针 比如这里指针变量 p1 char *p1=“abcde”(地址oaxx),那么“abcde” 的地址(oaxx)就会赋给指针p1。

2,指针变量和他所指向的内存空间变量是两个不同的概念(指针本身也是一个变量,只不过其内存中存储的地址,而不是常量)
我们可以把内存空间想象成一个个的抽屉,而把钥匙想象成钥匙,用现实中的具体事物来对应抽象概念,也能帮助我们更好地理解和掌握相关概念。

*关于笔者:
笔者理论物理硕士毕业后深圳工作,从事开发和项目管理四年,作为一名“非典型”开发人员,踩过很多坑,也真切地感受到自己在这过程中的成长。喜欢写作、摄影、足球,去年圆梦,去巴塞罗那看完梅西踢球后回到成都。四年韶华倾逝,转眼接近30,期间有很多思考和见闻想要分享,相聚是缘,希望以后能借助这个平台和大家一起进步和成长。

内存五区到底是什么?相关推荐

  1. 进程的内存分配,四区和五区

    四区和五区 C/C++把内存分为:栈区.堆区.全局区(静态区).常量区.代码区 C/C++中的内存分为四个区域,分别是: 1. 栈区(Stack):由编译器自动分配和释放,存放函数的参数值.局部变量的 ...

  2. iOS-底层原理 24:内存五大区

    iOS 底层原理 文章汇总 在iOS中,内存主要分为栈区.堆区.全局区.常量区.代码区五大区域.如下图所示 下面分别介绍这五大区 栈区(Stack) 定义 栈是系统数据结构,其对应的进程或者线程是唯一 ...

  3. iOS-底层原理 21:内存五大区

    在iOS中,内存主要分为栈区.堆区.全局区.常量区.代码区五大区域.如下图所示 下面分别介绍这五大区 栈区(Stack) 定义 栈是系统数据结构,其对应的进程或者线程是唯一的 栈是向低地址扩展的数据结 ...

  4. c/c++的内存四区

    内存四区的图示 内存四区的代码案例 #include <stdio.h> void fun() {static int k = 10; //初始化的静态局部变量(data区的rw段)sta ...

  5. 【C 语言】内存四区原理 ( 内存四区建立流程 )

    文章目录 一.内存四区建立流程 一.内存四区建立流程 内存四区 建立流程 : 1. 加载代码到内存 : 操作系统 中 执行 可执行程序 , 将 存放在硬盘中的 可执行程序 ( 包含代码 ) 加载到内存 ...

  6. android 6gb和8gb区别,手机6GB内存和8GB内存的差距到底有多大?你可能被忽悠了!...

    原标题:手机6GB内存和8GB内存的差距到底有多大?你可能被忽悠了! 随着科技的发展,现在手机已经是人们生活中必需品,当然现在手机内存也是越来越大,4G运行内存已经是标配了,然而很多人都在好奇6GB运 ...

  7. Linux学习之系统编程篇:mmap 内存映射区

    (1)作用:将磁盘文件的数据映射内存,用户通过修改内存就能修改磁盘文件. (2)函数原型: void *mmap(void *addr, size_t length, int prot, int fl ...

  8. C语言程序的内存四区模型

    C语言程序的内存四区模型 内存四区的建立流程 流程说明 各区元素分析 内存四区的建立流程 流程说明 1.操作系统把物理硬盘代码load到内存 2.操作系统把c代码分成四个区 3.操作系统找到main函 ...

  9. 内存四区 malloc/free与new/delete的区别

    前言 之前写了一篇关于<快速排序的4种优化>的博文,当时在验证各种情况的时候忽略内存分配的问题,导致所得到的结果分析的不全面.因为在刚开始写程序的时候将数组声明在 main() 里面,这样 ...

最新文章

  1. python xpath用法_Python--xpath的使用
  2. 一篇SSM框架整合友好的文章(二)
  3. Yann LeCun最新文章:自监督学习的统一框架
  4. samba安装部署及简单用法
  5. OpenStack部署
  6. 组件通信 eventtBus
  7. setfacl 权限导出_linux学习-setfacl设置特定目录用户权限
  8. TurboLinux11system»adjtimex简介
  9. 英语总结系列(五):英语无处不在
  10. oracle查询结果怎么去掉重复的,怎么去除重复的查询结果
  11. 大龄屌丝自学笔记--Java零基础到菜鸟--006
  12. gephi java教程_为Gephi准备数据
  13. 下载全球任意台站的连续地震数据
  14. PHP 5.6,7.0,7.1,7.2 和 HHVM 运行效率比较
  15. kubectl exec
  16. train.py部分
  17. GPU-CUDA编程学习(四)-共享内存
  18. 关于Manifest
  19. 左程云算法笔记总结-基础提升篇
  20. 前端测试框架Jest——语法篇

热门文章

  1. python实现笑傲江湖人物关系网
  2. Cortana 在 Windows 11 上谢幕,“死”于生成式 AI 之手的第一款语音助手!
  3. java executors 详解_线程池—Executors 详解
  4. python药店销售数据分析_解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现...
  5. 有没有手写转文字软件?这三个软件很好用
  6. mac与applie手机同步复制功能
  7. js 判断不为null、undefind、空字符串等
  8. 虚拟服务器kvm esxi选择,kvm系统(esxi和pve哪个好)
  9. python安装scapy流程
  10. uniapp 默认横屏