数据段、代码段、堆栈段、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接口主要用于实现在应用初 ...
随机推荐
- javascript显示倒计时控制按钮
html: <a><span id="sendAgain" onclick="sendEmail()">2.再次发送激活邮件</s ...
- JQuery 判断某个属性是否存在 hasAttr
$(".fengye a").each(function () { if (typeof($(this).attr("href")) != "unde ...
- DTCMS自定义标签,tags分割
DTcms.Web.UI\Label\article.cs /// <summary> /// 自定义:分割tags /// </summary> /// <param ...
- Android Handler 原理
在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handle ...
- ubuntu 设置显示器的亮度
ubuntu电脑重新启动后,亮度都变成了最亮.似乎也没胡地方可以设置.只好通过写个脚本来做这个事了. # -*- coding: utf-8 -*- import dbus bus = dbus.Se ...
- Win7 64bit 成功安装ArcView3.X
本人参考 链接 已在Win7 64Bit 笔记本上成功安装ArcView3.3,于是记录以下心得。 Win7 64Bit安装不了ArcView3.X的原因在于: 1,ArcView3.X属于16Bit ...
- oracle 绿色版本 instantclient 使用说明
1,将instantclient直接放到D盘根目录 2,注册表修改 3,点击工具>>首选项, 在Oracle主目录名中输入“D:\instantclient_10_2\”,在OCI库中输入 ...
- DataGrid中取HyperLinkColumn列的值,处理DataGrid中绑定的特殊字符
DataGrid中取HyperLinkColumn列的值. /// <summary> /// 对datagrid中标签进行编码,处理特殊字符 /// </summary> / ...
- 【学习总结】OS X , IOS , IOS SDK , XCode之间的关系
几个基本的概念 : OS X : 属于桌面PC级别(IMac,MacPro等)对应安装的操作系统 IOS : 属于移动设备级别(Iphone,Ipad等)对应安装的操作系统 XCode: 是一个IDE ...
- [转载]Unity3D 访问Access数据库
在开始这个小教程之前呢,其实在网上你已经可以找到相关的资料了,但是我还是要把我自己做练习的一点东西分享出来.写这个教程的主要原因呢,是一个朋友在u3d的官网论坛里,找到了这个demo,但是在他使用的过 ...