• 一直以来,我们只是单纯的去运行执行 C 程序,并没有关心这个可执行文件里面包含着什么东西。

  • 参考UNIX 环境高级编程 7.6,记录C程序的存储空间布局。



* ### C程序由 正文段,初始化数据段,非初始化数据段,栈,堆组成
* ### 正文段,初始化数据段,非初始化数据段(bss)
```
正文段:CPU执行的机器指令部分。
```
```
初始化数据段:通常将此段称为数据段,包含了程序中需明确的赋初始值的变量。
比如说,c 程序中出现在任何函数之外的声明。
静态变量都在 初始化数据段:
static int i = 1000;
全局变量
int test = 100;
```
```
非初始化数据段: 一般我们称为 bss 段,这一名称来源于早期的汇编运算符,意思是 block started by symbol , 在程序开始执行之前,kernel 会将这个 bss 段中的数据全部初始化为0或者是空指针。
比如说:
未初始化局部变量:
static int chen;
全局变量:
ing test1[100];
```
* ### 写一段简单的代码,看一下上面的内存分布, 名字是test.c:
```c
#include

void test(void)
{
printf("This is test function\n");
} int main(void)
{
printf(" This is main function\n");
return 0;
}
```c
看一下这个代码生成可执行文件的各个内存分布:
sbc_7109_454_pdk3@aplex:~/test/c_program$ gcc test.c -o test
sbc_7109_454_pdk3@aplex:~/test/c_program$ size test
text data bss dec hex filename
1229 552 8 1789 6fd test
    然后,我们在里面加一个局部变量,全局变量:
![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817113549365-425031064.png)
![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817113911240-769225067.png)
    在看一下局部静态变量:
![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817114334756-1509640442.png)
  • 栈和堆

    在执行程序前,我们能看到的是上面的 非初始化数据段以及初始化数据段和正文段,在执行了程序后,我们还能看到栈和堆。
    栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次调用函数时,其返回地址以及调用者的环境信息,都存放在栈中。然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,可以递归调用C函数,递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。
局部变量也是存放在栈区。
    堆:动态内存分配。堆处于非初始化数据段和栈之间。
  • 代码 test.c:

    #include <stdio.h>
#include <stdlib.h>
#include <string.h> void test(void)
{
printf("This is test function\n");
} int test1 = 100;
int test2; int main(void)
{
int a;
static int b = 100;
static int c;
char *test3; test3 = (char *)malloc(sizeof(char) * 10); int *pa = &a, *pb = &b, *pc = &c, *ptest1 = &test1, *ptest2 = &test2;
printf("桟:pa = %p\n", pa); // 桟 stack
printf("堆:test3 = %p\n", test3); // 堆 heap
printf("bss: ptest2 = %p\n", ptest2); // 未初始化的数据区
printf("bss: pc = %p\n", pc); // 未初始化的数据区 bss
printf("data: ptest1 = %p\n", ptest1); // 初始化的数据区
printf("data: pb = %p\n", pb); // 初始化的数据区 free(test3); return 0;
}
![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817131823225-423244804.png)
  • 空间分配如下图所示:

C 程序的存储空间记录的更多相关文章

  1. IT第二十天 - 面向对象编程思想、抽象类、异常处理、程序操作日志记录、本周总结 ★★★

    IT第二十天 上午 面向对象编程思想 1.组装电脑的设计: (1)电脑的组成:显示器+机箱 (2)机箱的组成:电源+主板+硬盘 (3)主板所包含的部件:cpu+内存+PCI接口+usb接口 (4)PC ...

  2. linux 下Qt WebEngine 程序打包简单记录

    本次记录仅作参考. 程序说明: 程序是一个编解码器控制管理的工具,使用到的库有:Qt的WebEngine.OpenGL模块.poco库.libmicrohttpd.libcurl.libvlc.同时程 ...

  3. 在程序异常中记录堆栈信息(使用ExWatcher)

    在我们编写程序的时候可通过IDE自带的调试环境捕捉到异常(Except)错误,并能查看到相关的信息以便我们修正程序中的问题.但当软件被发布出去后,因为所部署运行的环境与我们的调试环境有很大区别,即使在 ...

  4. IIS网站部署后,程序常见错误记录

    1.网站部署步骤 开启IIS服务.打开IIS管理器.添加网站.修改程序池(4.0).部署完成. 2.常见问题记录(问题记录比较模糊,仅做参考) (1).对于web.config连接数据库的配置为win ...

  5. zigw 和 nanoWatch, libudev.so 和 XMR 挖矿程序查杀记录

    最近这两天以来,服务器一致声音很响.本来以为有同事在运行大的程序,结果后来发现持续很长时间都是这样,并没有停的样子.后来查了一下,发现有几个可疑进程导致,干掉之后,果然服务器静悄悄了. 但是,问题并没 ...

  6. 转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)

    http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常 ...

  7. 利用jdk中工具完成Java程序监控方法记录

    转载加自己整理的部分内容,转载自:http://jiajun.iteye.com/blog/810150 记录下JConsole使用方法 一.JConsole是什么    从Java 5开始 引入了 ...

  8. Log4net控制台和窗体程序无法输出记录的原因之一

    在asp.net web应用程序中,读取log4net的配置文件可以这样写: [assembly:log4net.Config.XmlConfigurator(ConfigFile="Web ...

  9. 小程序踩坑记录-上传图片及canvas裁剪图片后上传至服务器

    最近在写微信小程序的上传图片功能,趟过了一些坑记录一下. 想要满足的需求是,从手机端上传图片至服务器,为了避免图片过大影响传输效率,需要把图片裁剪至适当大小后再传输 主要思路是,通过wx.choose ...

随机推荐

  1. WinForm如何调用Web Service

    参考地址 今天看了李天平关于WinForm调用Web Service的代码,我自己模仿做一个代码基本都是复制粘贴的,结果不好使.郁闷的是,又碰到那个该死的GET调用Web Service,我想肯定又是 ...

  2. PHP-VC9/VC6 TS/NTS等版本之间的区别

    PHP的更新升级是越来越快了,PHP 5.2 版本已经更新到5.2.17不再更新, 5.3版本的更新到了5.3.8,PHP 5.4马上就要发布,甚至PHP6.0也在开发中.有这么多版本供我们选择,真是 ...

  3. cxGrid显示行号

    定义一个类: TMyCxGrid = class(TObject) class procedure DrawIndicatorCell( Sender: TcxGridTableView; ACanv ...

  4. java MessageFormat.format

    sql 语句中格式化,如果加入{}占位符,要替代的是整形变量,而恰好这个整形变量的位数超过4位, MessageFormat.format 会在这个整形变量中默认每隔三位加一个逗号,类似这样:1000 ...

  5. 解决IIS动态内容压缩的问题

    转:http://www.cnblogs.com/cmt/archive/2013/03/10/iis-dynamic-dompression-mime.html

  6. PostgreSQL安装详细步骤(linux)

    官方安装文档:http://www.postgresql.org/download/linux/redhat/ 1. 检查PostgreSQL 是否已经安装 Linux-软件包管理-rpm命令管理-查 ...

  7. jquery插件--ajaxfileupload.js上传文件原理分析

    英文注解应该是原作者写的吧~说实话,有些if判断里的东西我也没太弄明白,但是大致思路还是OK的. jQuery.extend({ createUploadIframe: function (id, u ...

  8. LINUX使用FTP搭建网络版YUM源

    在YUM,FTP服务器上配置(192.168.56.2) .安装.配置vsftp # rpm -ivh vsftpd--.el6.x86_64 # chkconfig vsftpd on # serv ...

  9. Linux内核scatterlist API介绍

    1. 前言 我们在那些需要和用户空间交互大量数据的子系统(例如MMC[1].Video.Audio等)中,经常看到scatterlist的影子.对我们这些“非英语母语”的人来说,初见这个词汇,脑袋瞬间 ...

  10. 使用xshell远程登录ubuntu使用vi编辑不能使用删除键方向键

    近期安装了xshell,远程登录上ubuntu后,在插入模式下,按删除键没有任何反应,按方向键分别打印出A.B.C.D,每个字符一行. 这是因为ubuntu初始化安装的是vi的tiny版本,解决办法安 ...