知识点:
不同的数据在内存中会有不同的 保存时机,保存位置
当运行一个可执行文件时,操作系统就会把这个可执行文件加载到内存,形成进程,此时进程有一个虚拟的地址空间(内存空间)
linux有个nm命令:能够列出可执行文件中的全局变量存放的地址;
测试代码如下:
// 演示进程下内存分布
//
#include <iostream>
#include <time.h >
#include <stdio.h>
using namespace std;
int *ptest = new int(120); //堆
int g1; //bss 段
int g2;//bss 段
int g3 = 12; //数据段
int g4 = 32; //数据段
int g5;//bss 段
int g6 = 0;//bss 段
static int g7;//bss 段
static int g8 = 0; //bss 段
static int g9 = 10;//数据段
void mygfunc()
{
return;
}
//定义一个类
class MYACLS
{
public:
int m_i;
static int m_si; //声明不是定义 静态成员不占用具体对象的内存空间 存储在程序的数据段中
int m_j;
static int m_sj;
int m_k;
static int m_sk;
//static void myclsfunc() {}
};
int MYACLS::m_sj = 0; //这才是定义; //数据段
int main()
{
int i = 7;;
printf("i地址=%p\n", &i);
//下面打印的是全局变量 这些全局变量原来是存放在可执行程序中的,多次加载到内存观察其内存位置都不变
printf("ptest地址=%p\n", &ptest);
printf("g1地址=%p\n", &g1);
printf("g2地址=%p\n", &g2);
printf("g3地址=%p\n", &g3);
printf("g4地址=%p\n", &g4);
printf("g5地址=%p\n", &g5);
printf("g6地址=%p\n", &g6);
printf("g7地址=%p\n", &g7);
printf("g8地址=%p\n", &g8);
printf("g9地址=%p\n", &g9);
printf("MYACLS::m_sj地址=%p\n", &(MYACLS::m_sj));
printf("mygfunc()地址=%p\n", mygfunc);
printf("main()地址=%p\n", main);
cout << (void*)mygfunc << endl;
return 1;
}