Linux c 地址空间 堆栈 数据段 代码段 变量存储位置

本文详细介绍了Linux环境中32位系统的地址空间分布,特别是栈、堆、数据段(bss和data)和代码段的工作原理。栈用于函数调用,保存返回地址和局部变量;堆自底向上增长,动态分配内存;数据段包含bss和data,分别存储未初始化和已初始化的全局变量。文章通过实例代码和汇编分析,阐述了变量的存储位置以及const常量的存储差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux 环境中,虚拟地址空间即用户程序可以看到的地址空间分为以下几个段,从上到下依次是栈,堆,bss,data,text

截屏2021-08-25 上午11.23.19

以下内容只适用于 32 位系统,64 位系统略微不同。

1、栈

1.1 栈的作用

在 c/c++ 中函数调用很常见,那么在底层函数调用是怎么实现的呢?c/c++ 中的函数调用,在会汇编指令中通过call 指令实现,当执行到 call 指令的时候,① 将函数所需参数从右到左依次入栈,例如调用 printf("a+b=%d\n",sum);,sum 入栈,字符串"a+b=%d\n"的地址入栈,② CPU 首先将call 指令之后指令地址入栈,当函数 return 的时候可以继续往下执行。当进入函数内部的时候,首先执行:

push   %ebp
mov    %esp,%ebp

此时 ebp 代表该函数的栈顶地址,一个栈帧表示一个函数的调用过程,此时在该函数内部可以自由使用 ebp 以下的内存空间,可以通过将 sp 寄存器减去特定的值,来为函数的局部变量预留空间,变量地址可以通过 bp 指针获取。如下图所示:

截屏2021-08-25 下午12.11.13

当函数返回的时候,要确保栈的内容和调用之前一模一样。

1.2 栈的工作过程

现在通过代码来观察栈的工作过程。以下代码定义了一个求和函数,在 main 函数中将m,n,x,y 的和 保存在sum 变量中。 其中 sum 是未初始化变量,这主要为了测试,记得不要使用未初始化的变量。

int getSum(int a,int b,int c,int d){
   
    return a+b+c+d;
}
int main(){
   
    <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值