数据段、代码段、堆栈段、BSS段
在linux中,进程在内存中一般会分为5个段,用来存放从磁盘载入的程序代码,等.
这五个段分别是:
BSS段:
通常用来存放程序中未初始化的全局变量的一块内存区域.属于静态内存分配.
问题:全局变量不都是默认被初始化为0吗?
(data)数据段:
通常是指用来存放程序中已初始化的全局变量的一块内存区域.数据段属于静态内存分配.
(text)代码段:
通常指用来存放程序执行代码的一块内存区域.这部分区域在程序运行前就已经确定,并且内存区域通常属于只读.(某些架构也允许代码段可写),在代码段中也有可能存在一些只读常量,如只读的字符串等.
(heap)堆:
堆是用来存放进程运行中被动态分配的内存段,它的大小不固定,可动态扩张或缩减.当进程调用malloc分配内存时,就是从堆中分配,当free内存时,堆中去除此内存
(stack)栈:
用户存放程序临时创建的局部变量,也叫自动变量.此外,函数被调用时,参数也被压入发起调用的进程栈中,调用结束后,函数返回值也被存放回栈中.由于栈先进先出特点,所以栈适合用来保存/恢复调用现场.即我们可以把栈看成一个寄存,交换临时数据的内存区.
实例分析
#include <stdio.h>
#include <stdlib.h>
int outa=5;
int outb;
struct try{
int haha;
char heihei;
};
struct try *try_1=NULL;
int main(int argc, char *argv[])
{
char *a="haha12345678";
int b=0xa5;
static int in_s_a=567;
try_1=(struct try*)malloc(sizeof(struct try));
printf("\taddress_in_a=0x%x,\n \
\r\taddress_a=0x%x,\n \
\r\taddress_b=0x%x,\n \
\r\taddress_outa=0x%x,\n\
\r\taddress_outb=0x%x,\n\
\r\taddress_malloc_try_1=0x%x,\n\
\r\taddress_main=0x%x,\n",
&in_s_a,&a,&b,&outa,&outb,&try_1,&main);
return 0;
}
编译:
gcc hello.c
运行:
./a.out
结果:
./a.out
address_in_a=0x60102c,
address_a=0x1b77fe50,
address_b=0x1b77fe5c,
address_outa=0x601028,
address_outb=0x601048,
address_malloc_try_1=0x601040,
address_main=0x400544,
说明:
堆:存放全局变量且在内存底部;
栈:存放局部变量在内存顶部;
代码段:在栈下面
分配内存:在堆中.
BSS段:暂时不明白.
补充:
.bss
未初始化的全局变量和局部静态变量一般放在bss段中.
我们知道未初始化的全局变量和局部静态变量默认值都为0,本来他们也可以被放到.data段中.但是,未初始化的全局变量和局部静态变量默认值都为0,所以为它们在.data段分配空间并存放0没有必要,程序运行的时候它们的确是要内存空间.并且可执行文件必须记录所有未初始化的全局变量和局部静态变量的大小总和,记为.bss段.所以bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容,所以它在文件中也不占据空间.
数据段、代码段、堆栈段、BSS段的更多相关文章
- 假设写一段代码引导PC开机这段代码是 ? Here is a tiny "OS" :-D
Hello world -- OS 我找到了华科绍志远博士的相关代码,发现他依据MIT的JOS的boot.S 稍作改动.然后单独剥离出来,能够非常好玩~ 资料下载地址: http://download ...
- LINUX下目标文件的BSS段、数据段、代码段
http://blog.chinaunix.net/uid-27018250-id-3867588.html bss 未初始化的全局数据 data 已经初始化的全局数据 text 代码段,机器指令 r ...
- 程序运行中(BSS段、数据段、代码段、堆栈)
程序运行中(BSS段.数据段.代码段.堆栈) BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简 ...
- linux代码段,数据段,BSS段, 堆,栈(二)
//main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char ...
- 【转】linux代码段,数据段,BSS段, 堆,栈
转载自 http://blog.csdn.net/wudebao5220150/article/details/12947445 linux代码段,数据段,BSS段, 堆,栈 网上摘抄了一些,自己组 ...
- 浅谈c语言代码段 数据段 bss段
代码段.数据段.bss段 (1)编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分. (2)代码段:代码段就是程序中的可执行部分,直观理解 ...
- 静态库动态库的编译、链接, binutils工具集, 代码段\数据段\bss段解释
#1. 如何使用静态库 制作静态库 (1)gcc *.c -c -I../include得到o文件 (2) ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库 ...
- C语言引用连接脚本lds中的符号——清除bss段,c实现方式
之前我们的启动文件清除bss和拷贝都是通过汇编的方式的实现,但是,我们能够使用C语言,就不使用汇编: 先看连接脚本: SECTIONS { . = 0x30000000; __code_start = ...
- iOS测试一段代码的运行时间
王刚韧 23:19:26测试一段代码的运行时间 测试一段代码运行花了多久: NSDate* tmpStartData = [NSDate date] ;<#代码#> double delt ...
- springboot工程启动即执行一段代码
最近在做一个项目, 需要Tomcat启动后就执行一段代码 在这里需要用到CommandLineRunner这个接口, Spring boot的CommandLineRunner接口主要用于实现在应用初 ...
随机推荐
- Guzz
http://www.cnblogs.com/shitou/archive/2011/05/31/2064838.html
- antuomake 生成configure的使用
configure 作为编译配置脚本,有大量选项可供不同编译需求,这些选项直 接作用到最终生成的Makefile文件 问题:automake默认的gcc编译选项为-Wall -O2 -g,怎么改为我们 ...
- DTcms同一频道需要两种类型的列表模版思路
放两个列表模版即可,两个模版下的内容都可以访问,同一个内容展示不同的模版,需要什么栏目,链接就写哪个. 对动态链接进行判断,选择 最终效果: 频道URL配置
- 利用input事件来监听移动端的输入
今天遇到一个新需求,经理要求评论功能需要限制字数,就像微博那样限制最多输入150字,这里就需要实时提醒用户还能输入多少字了. 在最开始的时候,想到的是监听keyup事件,然后计算用户输入的字数,但是有 ...
- jquery checkBox的问题
在新版的jquery中选择ckeckbox最好使用prop方法,否则会出现一些问题.比如手动点击取消,再使用代码全选或者反选时候就不好使啦!!!
- MySQL基础学习之函数
数学函数 绝对值 abs() 圆周率 PI() 平方根 sqrt() 模除取余 mod(被除数,除数) 随机数 rand() 四舍五入 round(数字) 次方 ...
- ARM-Linux S5PV210 UART驱动(4)----串口驱动初始化过程
对于S5PV210 UART驱动来说,主要关心的就是drivers/serial下的samsung.c和s5pv210.c连个文件. 由drivers/serial/Kconfig: config S ...
- javac mac 终端乱码
java和javac在简体中文的Mac OSX的终端(Terminal.app)环境下,默认是以GBK编码的中文输出各种诸如语法错误,数组访问越界之类的信息.但是,Mac的终端的默认编码是UTF-8, ...
- mysqlsla慢查询分析工具教程
mysqlsla是一款帮助语句分析.过滤.和排序的功能,能够处理MySQL慢查询日志.二进制日志等.整体来说, 功能非常强大. 能制作SQL查询数据报表,分析包括执行频率, 数据量, 查询消耗等. 且 ...
- 如何查看windows操作系统当前使用的字符集
如何查看windows操作系统当前使用的字符集 Chcp 显示活动控制台代码页数量,或更改该控制台的活动控制台代码页.如果在没有参数的情况下使用,则 chcp 显示活动控制台代码页的数量. 语法 ch ...