您的位置:首页 > 运维架构 > Linux

Linux应用程序地址布局

2016-02-19 21:44 731 查看

关于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);
}


编译程序 gcc -g -test.c -o text

执行程序,停在死循环处

打开另外一个终端,自行 ps aux 查看进程的pid 例如这个程序为 4902

执行 cat /proc/4902/maps 来查看这个程序的内存分布输出


x:可执行程序

w:可写

stack:堆

0x08048000–0x08049000 为代码段

0x08049000–0x0804a000 为数据段

然后对照程序输出地址可以对应都储存在哪个段

如何看.BSS段:使用 readelf -S 程序名



0x000008表示宽度为8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: