数据段、代码段、堆栈段、BSS段的区别

最近在复习一些以前的知识点,整理了一些相关的基本概念,以下的概念网上有博客已经提出了,在此我将这些知识点进行总结:

5个数据段

       进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途 不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。对任何一个普通进程来讲,它都会涉及到5种不同的数据段。

Linux进程的五个段

下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的。

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

它是由操作系统分配的,内存的申请与回收都由OS管理。

PS:

全局的未初始化变量存在于.bss段中,具体体现为一个占位符;全局的已初始化变量存于.data段中;而函数内的自动变量都在栈上分配空间。.bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);而.data却需要占用,其内容由程序初始化,因此造成了上述情况。

bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。
data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。 数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到 ,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。

接下来看一个例程:

#include <stdio.h>
#include <stdlib.h>

int BSS ;       //位于BSS段,存放在程序组未初始化的内存区域
int data = 100 ;  //位于数据段,存放在程序中已经初始化的内存区域
static int y ; //静态区
int stack(void) ;
int main(void)
{
	static int  k  ;  //静态区
	int i , j ;   //栈区  内存自动申请自动释放
	int *p = NULL ;
	p = malloc(1024) ; //堆区  内存手动申请手动释放
	free(p);
	return 0 ;
}
int stack(void)
{
	//栈区
	int i ;
	return 0 ;
}
时间: 2025-01-02 07:21:41

数据段、代码段、堆栈段、BSS段的区别的相关文章

c#-这两段代码,只能运行其中一段,想用if语句来判断,但不知道条件表达式该怎么写

问题描述 这两段代码,只能运行其中一段,想用if语句来判断,但不知道条件表达式该怎么写 foreach (Uers item in userGroup) //第一段 { Console.WriteLine("请输入账号"); string idC1 = Console.ReadLine(); Console.WriteLine("请输入密码"); string pwd1 = Console.ReadLine(); if (idC1.Equals(item.idC)

正则-如何用php匹配出这段代码?

问题描述 如何用php匹配出这段代码? 有这样一段代码 <div><div><span><span>网盘链接: </span> </span> <span><a href="/ntcweb?id=d866a750-9cec-430a-9ea0-5cfbd6a2007a&level=2&pg=webz&uID=thJP9WeIiHG9tvFy&g_ut=2&key=jg

linux编程-关于linux内存 数据段和bss段的疑惑???

问题描述 关于linux内存 数据段和bss段的疑惑??? 数据段和bss段分别存放 已初始化/未初始化 的全局变量和静态变量. 那么,假如bss段的全局变量和静态变量在代码执行中被初始化了,那么会不会被转移到 数据段存储呢??? 解决方案 首先我觉得你所说的在执行中被初始化的说法是不正确的,应该叫赋值. 接下来我们看一段代码: #include <stdio.h> int a; int b=10; int c=11; int main(void) { int d; int e=12; ret

数据-这段代码哪里错呀,帮我改改可好,谢谢啦

问题描述 这段代码哪里错呀,帮我改改可好,谢谢啦 #include"stdio.h" struct STUDENT { char id[3]; char name[10]; int score[5]; double ave; }stu[10]; void main() { int num=10,i,j,all=0; for(i=0;i<num;i++) { printf(" 请输入第%d学生的数据:",i+1); printf(" 学号: "

c++数据结构堆栈加减乘除运算器 我从教科书上copy了一段代码但是输入后直接停止工作求解

问题描述 c++数据结构堆栈加减乘除运算器 我从教科书上copy了一段代码但是输入后直接停止工作求解 我输入的是自带测试用例运算式 (((60+40)/50*(16-4)) #include #include #include #include #include using namespace std; double read_and_evaluate(istream& ins); void evaluate_stack_tops(stack& numbers,stack& ope

雅虎财经数据-麻烦各位大神给看下下面这段代码,运行不起来。请帮忙看下是什么原因(是在Python上运行的)

问题描述 麻烦各位大神给看下下面这段代码,运行不起来.请帮忙看下是什么原因(是在Python上运行的) from matplotlib.finance import quotes historical_yahoo from datetime import date import pandas as pd today=date.today() start=(today.year-1,today.month,today.day) quotes=quotes_historical_yahoo('AXP

这段代码输出保存在数据库中的json格式数据怎么用java代码在前端显示出来

问题描述 这段代码输出保存在数据库中的json格式数据怎么用java代码在前端显示出来 public class SaveHotKeySkillReq extends CommandBase { @Resource //数据库操作 private EntityManager em; protected void execute() throws GMessageException { CRequesthotKeyChange msg = pak.readMsg(CRequesthotKeyCha

语言-新手求帮忙看下这段代码的数据溢出问题,没有C币理解下(我是在CodeBlock10.05下运行的)

问题描述 新手求帮忙看下这段代码的数据溢出问题,没有C币理解下(我是在CodeBlock10.05下运行的) #include #include #include unsigned int Ex_secret[30]={11,4,120,75,170,204,90,59,78,49,//用0~255的数表示8位2进制,一共240位 148,248,190,137,0,9,17,91,174,105,45,124,177,205,57,97,194,155,120,36}; unsigned in

php-求一段能用的PHP发送json数据的代码

问题描述 求一段能用的PHP发送json数据的代码 不要复制粘贴的,网上都不能用 function http_post_data($url, $strjson) { $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, $strjson); curl_setopt($ch, CURLOPT_HTT