深入理解C语言内存管理

之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少。

问题不能拖,我这就来学习一下吧,争取一次搞定。?在任何程序设计环境及语言中,内存管理都十分重要。

内存管理的基本概念

分析C语言内存的分布先从Linux下可执行的C程序入手。现在有一个简单的C源程序hello.c

1 #include

2 #include

3 int var1 = 1;

4

5 int main(void) {

6 int var2 = 2;

7 printf("hello, world!\n");

8 exit(0);

9 }

经过gcc hello.c进行编译之后得到了名为a.out的可执行文件

[tuhooo@localhost leet_code]$?ls -al a.out-rwxrwxr-x. 1 tuhooo tuhooo 8592 Jul 22 20:40 a.out

ls命令是查看文件的元数据信息

[tuhooo@localhost leet_code]$?file a.outa.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=23c58f2cad39d8b15b91f0cc8129055833372afe, not stripped

file命令用来识别文件类型,也可用来辨别一些文件的编码格式。

它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的。

[tuhooo@localhost leet_code]$?size a.out

text?

data

bss

dec

hex

filename

(代码区静态数据)

(全局初始化静态数据)

(未初始化数据区)?

(十进制总和)

(十六制总和)

(文件名)

1301

560

8

1869

74d

a.out

显示一个目标文件或者链接库文件中的目标文件的各个段的大小,当没有输入文件名时,默认为a.out。

size:支持的目标: elf32-i386 a.out-i386-linux efi-app-ia32 elf32-little elf32-big srec symbolsrec tekhex binary ihex trad-core。

那啥,可执行文件在存储(也就是还没有载入到内存中)的时候,分为:代码区、数据区和未初始化数据区3个部分。

进一步解读

(1)代码区(text segment)。存放CPU执行的机器指令(machine instructions)。通常,代码区是可共享的(即另外的执行程序可以调用它),因为对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。

(2)全局初始化数据区/静态数据区(initialized data segment/data segment)。该区包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。例如,一个不在任何函数内的声明(全局数据):

1 int maxcount = 99;

使得变量maxcount根据其初始值被存储到初始化数据区中。

1 static mincount = 100;?

这声明了一个静态数据,如果是在任何函数体外声明,则表示其为一个全局静态变量,如果在函数体内(局部),则表示其为一个局部静态变量。另外,如果在函数名前加上static,则表示此函数只能在当前文件中被调用。

(3)未初始化数据区。亦称BSS区(uninitialized data segment),存入的是全局未初始化变量。BSS这个叫法是根据一个早期的汇编运算符而来,这个汇编运算符标志着一个块的开始。BSS区的数据在程序开始执行之前被内核初始化为0或者空指针(NULL)。例如一个不在任何函数内的声明:

1 long sum[1000];

将变量sum存储到未初始化数据区。

下图所示为可执行代码存储时结构和运行时结构的对照图。一个正在运行着的C编译程序占用的内存分为代码区、初始化数据区、未初始化数据区、堆区和栈区5个部分。

?

再来看一张图,多个一个命令行参数区:

(1)代码区(text segment)。代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),

C语言文件联系人管理碎片整理,深入理解C语言内存管理.docx相关推荐

  1. 万字整理,肝翻Linux内存管理所有知识点【Linux内核开发人员必学】都是精髓

    Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...

  2. multiprocessing.manager管理的对象需要加锁吗_iOS内存管理布局-理论篇

    苹果设备备受欢迎的背后离不开iOS优秀的内存管理机制,那iOS的内存布局及管理方案是怎样的呢?我们一起研究下. 内存管理分为五大块 栈区(stack):线性结构,内存连续,系统自己管理内存,程序运行记 ...

  3. Spark 内存管理详解(下):内存管理

    本文转自:Spark内存管理详解(下)--内存管理 本文最初由IBM developerWorks中国网站发表,其链接为Apache Spark内存管理详解 在这里,正文内容分为上下两篇来阐述,这是下 ...

  4. multiprocessing.manager管理的对象需要加锁吗_iOS内存管理布局及管理方案理论篇

    苹果设备备受欢迎的背后离不开iOS优秀的内存管理机制,那iOS的内存布局及管理方案是怎样的呢?我们一起研究下. 内存管理分为五大块 栈区(stack):线性结构,内存连续,系统自己管理内存,程序运行记 ...

  5. Linux内存管理:一个故事看懂CPU内存管理技术

    目录 8086 32位时代 虚拟内存 分页交换 现在 往期热门回顾 推荐阅读 还记得我吗,我是阿Q,CPU一号车间的那个阿Q. 今天忙里偷闲,来到厂里地址翻译部门转转,负责这项工作的小黑正忙得满头大汗 ...

  6. 万字整理,肝翻Linux内存管理所有知识点

    Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...

  7. arm的linux怎么管理任务,【linux】arm mm内存管理

    欢迎转载,转载时请保留作者信息,谢谢. arm mmu硬件原理 由上图,arm分四种模式,section,大小页+ 极小页,  section模式简单,也能说明mmu本质,其它模式只是用了多级数组索引 ...

  8. python内存管理错误的是_关于Python内存管理,下列说法错误的是

    53 Python中变量可以不指定类型,会自动根据赋值语句来决定类型 同时,使用前必须赋值,在赋值的同时变量也就创建了 发表于 2018-02-28 22:50:02 回复(0) 61 本题答案选 B ...

  9. (转载)深入理解Linux中内存管理---分段与分页简介

    首先,必须要阐述一下这篇文章的主题是Linux内存管理中的分段和分页技术. 来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址.如果这个 ...

最新文章

  1. java override 访问权限_java 重写(Override)的规则
  2. css鼠标悬停样式_利用Css3样式属性Cursor来更换自定义个性化鼠标指针(光标
  3. 剑指Offer--青蛙跳台阶引发的一系列问题
  4. html文本框整数范围,验证HTML表单文本框中的数值范围。 PHP或Javascript
  5. learnpython3thehardway视频_LearnPython3theHardWay__Excercise 13 Parameters, Unpacking, Variables
  6. twisted系列教程十六–twisted守护进程
  7. 【报告分享】中国移动互联网2021年度大报告.pdf(附下载链接)
  8. 当代计算机技术在建筑设备中的应用,计算机技术在建筑设计中应用浅谈.doc
  9. ​BAT 等 34 家企业签署合规经营承诺书;美团被判赔偿饿了么 35.2 万元;FreeBSD 13.0 发布|极客头条...
  10. 自学python编程笔记本推荐-这件神器,每个 Python入门学习者都值得一试
  11. App Domains and dynamic loading
  12. [互联网思维(转)]互联网思维法则
  13. 多功能小游戏神器微信小程序源码
  14. 网络流量在线分析系统的设计与实现
  15. vue 循环播放音乐列表 音量控制
  16. 交换机路由器常用命令大全
  17. Linux运维技术之Linux云计算架构
  18. adb 安卓模拟器 进程端口_Android模拟器端口被占用问题的解决办法
  19. 自动备份电脑文件至云盘的操作,你会吗?
  20. nth_element用法

热门文章

  1. 影视明星杨幂写真合集:时尚优雅、气质迷人!
  2. ES聚合之Metric聚合语法讲解
  3. 烤仔观察 | “顶流”入局,数字藏品发展进入快车道
  4. 星载低波段极化SAR电离层法拉第旋转效应(FR)及校正国内外研究现状-学习笔记
  5. [Python]HTML转换为TXT的脚本
  6. 秒数转换成多少天/多少小时/多少分
  7. c++day06 多态的使用
  8. 脱下ChatGPT狂飙的外套看到的
  9. 我的财务自由和时间自由——3楼继续更新中
  10. Super Decisions