关于可执行文件中的内存分段的那些事

对于可执行文件的内存,我们通过下面的程序来理解

#include<stdio.h>
int m;                          //0   0x404050   未初始化的数据段bss
int n = 2;                      //    0x402000   数据段
static int k;                   //    0x404020
static int l = 16;              //    0x402004
char *r;                        //nul 0x0
char *s = "hello world";        //    0x403000   rdata
char array3[15];                //    0x404040
char array4[15] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; //   0x40200c
void insert()
{
 	int t;           //随机 0x60cc6c   堆栈段
	int a = 1;       //     0x60cc68
	static int c;    //     0x404010
	static int d = 3;//     0x40201c
	char *o;         //     0x
	char *p = "hi";  //     0x40300c
	char array[15];  //     0x60cc50
	char array1[15] = {0};//0x60cc40
	printf("     t:%p  %d\n",&t,t);
	printf("     a:%p  %d\n",&a,a);
	printf("     c:%p  %d\n",&c,c);
	printf("     d:%p  %d\n",&d,d);
	printf("     o:%p  %s\n",o,o);
	printf("     p:%p  %s\n",p,p);
	printf(" array:%p  %d\n",array,array[1]);
	printf("array1:%p  %d\n",array1,array1[1]);
	
}
int main()
{
	int i;
	printf("     i:%p  %d\n",&i,i);
	printf("     m:%p  %d\n",&m,m);
	printf("     n:%p  %d\n",&n,n);
	printf("     k:%p  %d\n",&k,k);
	printf("     l:%p  %d\n",&l,l);
	printf("     r:%p  %s\n",r,r);
	printf("     s:%p  %s\n",s,s);
	printf("array3:%p  %d\n",array3,array3[0]);
	printf("array4:%p  %d\n",array4,array4[0]);
	insert();
	return 0;
}

对于可执行文件,我们可以使用nm工具查看其内存分布(即:nm -s a.out),对于nm工具的使用,我们可以自行去man nm使用,数据在内存中的大概分布为:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值