1. 程序中的栈

1.1 栈的简介

(1)栈中现代计算机程序里最为重要的概念之一

(2)栈在程序中用于维护函数调用上下文

(3)函数中的参数和局部变量存储在栈上

(4)栈保存了一个函数调用所需的维护信息

1.2 函数调用过程

(1)每次函数调用都对应着一个栈上的活动记录,调用函数的活动记录位于栈的中部,被调用函数的活动记录位于栈的顶部。

(2)函数调用栈的变化:以 int main(){f();}→f(){}为例

1.3 函数调用栈上的数据

(1)函数调用时,对应的栈空间在函数返回前是专用的

(2)函数调用结束后,栈空间将被释放,数据不再有效

指向栈数据的指针

#include <stdio.h>

int* g()
{
int a[] = { }; return a; //返回栈中的数组
} void f()
{
int i = ;
int array[] = { , , , , , , , , , }; int* pointer = g();//pointer指向g函数栈中的数组 /*
//当g函数返回后,马上将栈中的数组保存到array中
//但如果有其他函数的调用,则pointer所指向栈中的数组数据将是无效的!
for (int i = 0; i < 10;i++)
{
array[i] = pointer[i];
} for (i = 0; i < 10;i++){
printf("array[%d] = %d\n", i, array[i]);
}
*/
} int main()
{
f(); return ;
}

2. 程序中的堆

(1)堆是程序中一块预留的内存空间,可由程序自由使用

(2)堆中被程序申请使用的内存在被主动释放前将一直有效

(3)为什么有了栈还需要堆?(栈上的数据在函数返回后就会被释放掉,无法传递到函数外部,如局部数组)

(4)C 语言中通过库函数的调用获得堆空间:malloc 和 free

(5)系统对堆空间的管理方式(空闲链表法、位图法、对象池法等等)

3. 程序中的静态存储区

(1)静态存储区随着程序的运行而分配空间

(2)静态存储区的生命周期直到程序运行结束

(3)在程序的编译期静态存储区的大小就己经确定。

(4)静态存储区主要用于保存全局变量和静态局部变量

(5)静态存储区的信息最终会保存到可执行程序中

静态存储区的验证

#include <stdio.h>

int g_v = ;     //静态区
static int g_vs; //静态区,只有本文件可见 void f()
{
static int g_v1 = ; //局部静态变量——静态区
printf("g_v1 = %p\n", &g_v1);
} int main()
{
printf("g_v = %p\n", &g_v); //g_v、g_vs、g_v1三者地址比较相邻
printf("g_vs = %p\n", &g_vs); f(); return ;
}

栈区主要用于函数调用的使用,堆区主要用于内存的动态申请和归还,静态存储区用于保存全局变量和静态变量

4.程序文件的一般布局

5.程序与进程

(1)程序是静态的概念,表现形式为一个可执行文件

(2)进程是动态的概念,程序由操作系统加载运行后得到进程

(3)每个程序可以对应多个进程,但每个进程只能对应一个程序

(4)包含脚本代码的文本文件也可以看作是一个可执行程序,其对应进程的功能与脚本的内容有关。

每种脚本文件对应着一些脚解释程序,双击脚本文件,操作系统加载相应的解释程序,变成一个进程,这个进程会读取并解释执行脚本代码。

这个进程与普通进程不同,它要完成的功能并不是固定的,而是与脚本文本的内容有关。

6.文件布局在内存中的映射

(1)各个段的作用

①堆栈段在程序运行后才正式存在,是程序运行的基础

②.bss 段存放的是未初始化的全局变量和静态变量

③.text 段存放的是程序中的可执行代码

④.data 段保存的是己经初始化了的全局变量和静态变量

⑤.rodata 段存放程序中的常量值,如字符串常量

(2)程序术语的对应关系

①静态存储区通常指程序中的.bss 和.data 段

②只读存储区通常指程序中的.rodata 段

③局部变量所占空间为栈上的空间

④动态空间为堆中的空间

⑤程序可执行代码存放于.text 段

(3)同是全局变量和静态变量,为什么初始化的和未初始化的保存在不同段中?

①全局的未初始化变量存在于.bss 段中,具体体现为一个占位符(只记录变量的地址及所占大小,不会造成最终 exe 文件变大);

全局的已初始化变量存于.data 段中,记录的是变量实际占用的大小及初始化值,会造成最终 exe 变大;

②考虑到了效率问题,将未初始化的与初始化分开加载。.bss 是不占用.exe 文件空间的,只是,其内容由操作系统加载时初始化(清零)

而.data 却需要占用空间,其内容由程序初始化。

参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html

C语言学习笔记--内存分区的更多相关文章

  1. c语言学习笔记.内存管理.

    内存: 每个程序的内存是分区的:堆区.栈区.静态区.代码区. 1.代码区:放置所有的可执行代码,包括main函数. 2.静态区:存放所有的全局变量和静态变量. 3.栈区:栈(stack),先进后出.存 ...

  2. C语言学习笔记--内存操作常见错误

    1. 野指针 (1)指针变量中的值是非法的内存地址,进而形成野指针 (2)野指针不是 NULL 指针,是指向不可用内存地址的指针 (3)NULL 指针并无危害,很好判断,也很好调试 (4)C 语言中无 ...

  3. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  4. 《C# 语言学习笔记》——C# 简介

    1 什么是.NET Framework .NET Framework 是Microsoft为开发应用程序而创建的一个富有革命性的新平台. 1.1 .NET Framework 的内容 .NET Fra ...

  5. 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项

    博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...

  6. JVM学习笔记——内存结构篇

    JVM学习笔记--内存结构篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存结构部分 我们会分为以下几部分进行介绍: JVM整体介绍 程序计数器 虚拟机栈 本地方法栈 堆 方法 ...

  7. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  8. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

  9. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

随机推荐

  1. openstack havana块存储Cinder磁盘加密方法研究

    http://blog.csdn.net/cloudresearch/article/details/19092219 在openstack havana的release note中有如下介绍“Att ...

  2. struts学习(3)

    1 ognl概述 2 ognl入门案例 3 什么是值栈 (1)servlet和action区别 (2)值栈存储位置 4 如何获取值栈对象 5 值栈内部结构 6 向值栈放数据 (1)s:debug标签 ...

  3. 去除sql中不可见字符的n种方法

    CREATE TABLE [ASCII0127] ( Bin          INT, Dec          INT, Hex          VARCHAR(128), Abbr       ...

  4. java:管道流(线程间管道流)

    class Send implements Runnable{ PipedOutputStream pos = null; public Send() { this.pos = new PipedOu ...

  5. 代码题(59)— 字符串相加、字符串相乘、打印最大n位数

    1.415. 字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 思路:和链表相加类似,求进位. class Solution { public: string addS ...

  6. nyojb 2359 巴什博弈变形

    http://acm.nyist.me/JudgeOnline/problem.php?id=2359 2359: 巴什博弈? 时间限制: 1 Sec  内存限制: 30 MB提交: 237  解决: ...

  7. IaaS中的统一存储:从设计到实现

    转自:https://www.ustack.com/blog/tycc/ “原生的OpenStack并不支持统一存储,云主机服务Nova.镜像服务Glance.云硬盘服务Cinder的后端存储各不相同 ...

  8. Redis中redis.conf配置总结

    redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程  daemonize no2. 当Redis以守护进程方式运行时,Re ...

  9. 剑指offer--4.斐波那契数列

    int最大范围(有符号情况下,从第0项0开始)能取到第46项1836311903,47项溢出 时间限制:1秒 空间限制:32768K 热度指数:473928 题目描述 大家都知道斐波那契数列,现在要求 ...

  10. awk指令的使用

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大 awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔 ...