Linux应用程序地址布局

关于const常量在内存中的位置新认识

main函数外定义 const int a =1;//这里存在代码段,如果用指针去修改会出现段错误,访问非法内存,因为代码段不允许写
在函数内定义 const int b = 1;//这里存在中,所以相当于只读变量,可以利用指针修改

内存布局

这里写图片描述

代码示例

test.c

#include <stdio.h>
#include <malloc.h> 
int global_init_a = 1;//全局、初始化、变量 :数据段 
int global_uninit_a;//全局 、未初始化、变量 :数据段
static int static_global_init_a = 1;//全局 静态、初始化 :数据段
static int static_global_uninit_a;//全局、静态、未初始化 :数据段
const int const_global_a = 1;//全局 常量 代码段

void main()
{
    int local_init_a = 1;//局部、初始化:栈 
    int local_uninit_a;//局部 未初始化 :栈 
    static int static_local_init_a = 1;//数据段 
    static int static_local_uninit_a;//数据段 
    const int const_local_a = 1;//栈 
    malloc_p_a = malloc(sizeof(int));//堆 
    /*
    *打印各个数据的地址 
    */  
    while(1);   
}
  1. 编译程序 gcc -g -test.c -o text
  2. 执行程序,停在死循环处
  3. 打开另外一个终端,自行 ps aux 查看进程的pid 例如这个程序为 4902
  4. 执行 cat /proc/4902/maps 来查看这个程序的内存分布输出这里写图片描述
    x:可执行程序
    w:可写
    stack:堆
    0x08048000–0x08049000 为代码段
    0x08049000–0x0804a000 为数据段
  5. 然后对照程序输出地址可以对应都储存在哪个段
    如何看.BSS段:使用 readelf -S 程序名
    这里写图片描述
    0x000008表示宽度为8
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WAF001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值