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
相关文章推荐
- gitk安装(linux,window)
- Linux CentOS系统启动时遇到的报错
- linux platform_devices platform_driver platform_resource 的使用
- linux学习第二天
- linux io 阻塞,非阻塞,同步,异步
- Linux 源码安装Python
- centos6 安装fcitx坎坷
- linux 启动network后报错:device eth0 does not seem to be present, delaying initialization
- Linux下怎么来利用crontab实现计划任务
- linux下测试python程序执行时间
- centos ftp简单搭建
- linux 命令 小计
- linux实战(七)----发送邮件通知----实例运用
- linux实战(七)----发送邮件通知----实例运用
- 安装中文CentOS 6.5的详细步骤
- LinSSID:图形化的wifi扫描器在GNU Linux(Debian系)下的安装
- Linux下基于vsftpd搭建ftp服务器
- Linux命令之查找
- Centos7无法使用ssh登陆及解决方案
- linux环境搭建记录