本文描述一下:C运行时的数据结构,相关的段,压栈等

unix默认的编译器会将编译生成的文件默认命名为a.out

目标文件和可执行文件可以有几种不同的格式,所有这些不同格式具有一个共同的概念,那就是段。

这里的段表示一个二进制文件相关的内容块。

用size + 可执行文件名 可以显示这个文件的三个段(文本段,数据段和BSS段)的大小

文本段是用于保存编译后的指令的。

数据段是用于保存初始化的全局和静态变量。

BBS(Block Started by Symbol)由符号开始的块,用于保存没有值的变量,貌似并不需要保存这些变量的映像,BBS段不占据目标文件的任何空间。

如图是相应代码和对应编译后目标文件的段:

#include<stdio.h>

main()

{

printf("hello
world!\n");

}

下面来size一下这段代码编译后的文件:

text表示文本段,data表示数据段,bss表示 BSS段,

dec表示十进制三个段总和,hex是表示十六进制总和。

接下来在上述代码中加入一个全局的int[1000]的数组声明:

#include<stdio.h>

int
a[1000];

main()

{

printf("hello
world!\n");

}

说明声明了一个全局变量数组只增加了bss段,增加了4028。

现在将它初始化

#include<stdio.h>

int
a[1000] = {1};

main()

{

printf("hello
world!\n");

}

发现bss段变回原来的4,数据段增加了4024,这里为什么不是和bss一样增加了4028呢?

int[1000]应该只占用了4000字节,其他的可能是有存一下指针或者段的分割标志之类的吧,具体不是很清楚呀,希望知道的朋友告诉我一下。

在函数内声明一个巨大的数组

#include<stdio.h>

int
a[1000] = {1};

main()

{

printf("hello
world!\n");

int
b[1000000];

}

发现并未变化,现在将其初始化:

#include<stdio.h>

int
a[1000] = {1};

main()

{

printf("hello
world!\n");

int
b[1000000] = {1};

}

发现初始化的局部数组b使得文本段增加了。

数据段是保存在目标文件中的。

BBS段不保存在目标文件中的。

文本段是最容易受优化措施影响的段。

a.out文件的大小受调试状态下编译的影响,但段不受影响。

下面来看开进程的地址空间图:

堆栈段主要有三个用途,其中两个跟函数有关,另一个跟表达式计算有关。

1.堆栈为函数内部声明的局部变量提供储存空间。

2.进行函数调用时,堆栈储存与此有关的一些维护性的信息。

3.堆栈也可以被用作暂时存储区。

堆栈的建立顺序大致为:

参数入栈

返回地址入栈

代码跳转到被调用函数处执行

EBP指针入栈

为局部变量分配地址

通用寄存器入栈

参考:http://www.cnblogs.com/Binhua-Liu/archive/2010/08/24/1803095.html

他这里是vs下编译的,linux下可能有一些不同,具体的还没研究,希望到时再研究一下~

C运行时的数据结构的更多相关文章

  1. Runtime运行时机制

    Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的 我们需要了解的是 Objective-C 是一门动态语言, ...

  2. C语言运行时数据结构

    段(Segment): 对象文件/可执行文件: SVr4 UNIX上被称为ELF(起初"Extensible Linker Format", 现在"Executable ...

  3. iOS开发——高级特性&Runtime运行时特性详解

    Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...

  4. Objective-C Runtime 运行时之一:类与对象

    Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...

  5. Objective-O Runtime 运行时初体验

    Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...

  6. 探究JVM——运行时数据区

    最近在读<深入理解Java虚拟机>,收获颇丰,记录一下,部分内容摘自原书. Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

  7. Runtime运行时的那点事儿

    注:本文是对 Colin Wheeler 的 Understanding the Objective-C Runtime 的翻译. 初学 Objective-C(以下简称ObjC) 的人很容易忽略一个 ...

  8. iOS开发之runtime运行时机制

    最近参加三次面试都有被问到runtime,因为不太懂runtime我就只能支支吾吾的说点零碎.我真的好几次努力想看一看runtime的知识,因为知道理解它对理解OC代码内部变化有一定帮助,不过真心觉得 ...

  9. MFC六大核心机制之二:运行时类型识别(RTTI)

    上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...

随机推荐

  1. hide your website's wordpress info/path/way

    Hide Wordpress Info of your website plugin hide-wp 使用apache语句和wp方法重写 但这个插件有个局限就是,你的网站使用的wordpress的话, ...

  2. centos查看磁盘扇区大小等信息

    fdisk -l 说明一下: “Disk /dev/sda: 53.7 GB, 53687091200 bytes” 表示第一块磁盘的大小为53.7GB. "255 heads"表 ...

  3. Android 仿美团网,大众点评购买框悬浮效果之修改版

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17761431),请尊重他人的辛勤劳动成果,谢谢! 我之前写 ...

  4. HDU 5961:传递(暴搜)

    http://acm.hdu.edu.cn/showproblem.php?pid=5961 题意:中文题意.给出两个图,判断这个两个图是否都是传递的.注意一下传递的定义要看清,一开始没看清连样例都看 ...

  5. linux命令:du 命令

    Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...

  6. 【转载】使用barman备份PostgreSQL

    什么是barman Barman (备份和恢复管理器) 是 PostgreSQL 数据库服务器中非常方便的备份和恢复工具,允许远程备份多个服务器,允许从一个备份集中一个命令就恢复数据库.同时还可以对多 ...

  7. jquery相关校验以及jquery其他知识总结

    //************jquery校验**********/ //数字校验(整数)function isDigit(str) { var patrn=/^[0-9]*$/; return pat ...

  8. Pots 分类: 搜索 POJ 2015-08-09 18:38 3人阅读 评论(0) 收藏

    Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11885 Accepted: 5025 Special Judge D ...

  9. JAVA基础知识之网络编程——-基于AIO的异步Socket通信

    异步IO 下面摘子李刚的<疯狂JAVA讲义> 按照POSIX标准来划分IO,分为同步IO和异步IO.对于IO操作分为两步,1)程序发出IO请求. 2)完成实际的IO操作. 阻塞IO和非阻塞 ...

  10. 一个html5开发工具

    今天推荐一个Html5开发工具 sublimetext3 找了一个注册码 可用 —– BEGIN LICENSE —– Michael Barnes Single User License EA7E- ...