//粉碎命名后的名字可以打开XXX.obj文件查看
#include "stdafx.h"
void add(int n) //
{
static int nTest1=n; //
static int nTest2=n*n; //
static int nTest3=n*n*n; //
//因为静态变量在编译的时候名字已经被粉碎重新命名 且写在程序的数据段。
//此处的局部静态变量没有被初始化,那么将在程序第一次运行调用的时候被初始化
//问题: 如何确定是第一次调用?如何确保只初始化一次呢?
//编译器通过一个flag标记 来记录该变量是否已经被初始化,如果是,那么久不再初始化。
//通过指针可以修改该标记的值来使程序每次都能初始化
//VC6 编译器 无法再程序调试的时候正确显示局部变量 除非你在监视的地方输入编译器粉碎命名后的变量名字
//当出现连续多个static变量,且未被初始化。可以发现在变量地址附近有个标记地址通过位运算的方式来标记哪个变量已经被初始化
//如本例,p[1]地址就是记录标记值的地址 现在希望每次进入函数都使nTest1重新初始化,那么修改该地址的值为6对应的二进制值
//是00000110 那么说明第一位没有被初始化
// 00427C60 08 00 00 00 ....nTest3
// 00427C64 04 00 00 00 ....nTest2
// 00427C68 02 00 00 00 ....nTest1
// 00427C6C 07 00 00 00 标记地址 记录着上面3个变量是否被初始化
int* p=&nTest1;
p[1]=6;
return;
}
//静态全部变量在程序进入main之前就已经被初始化。因为在编译的时候就已经将其值写入PE文件中
static char g_szBuffer[]="yeook"; //
int main(int argc, char* argv[])
{
for (int i=2;i<10;i++)
{
add(i);
}
return 0;
}