c里的静态变量只初始化一次的原因

c里的静态变量只初始化一次的原因

来源于百度:

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
int initNum = 3;
for (int i=5; i > 0; --i)
{
static int n1 = initNum;
n1++;
printf("%d\n", n1);
}

getchar();
return 0;
}
[/code]
输出结果:
4
5
6
7
8

在这里我们可以看到虽然代码循环了5次,静态变量n1确实只初始化了一次。那么为什么呢?继续上代码,相信大家就会明白些许了。

int _tmain(int argc, _TCHAR* argv[])
{
int initNum = 3;
for (int i=5; i > 0; --i)
{
static int n1 = initNum;

//我们在这里了两句代码
int* p = &n1;
p++;
*p = 0;
//end

n1++;
printf("%d\n", n1);
}

getchar();
return 0;
}
[/code]
输出结果:
4
4
4
4
4

这次,静态变量居然跟随着5次循环也初始化了5次。你一定非常诧异,其实我们不难推断,其实静态变量就是通过静态变量后面的一个32位内存位来做记录,以标识这个静态变量是否已经初始化。而我们的p++;*p = 0;却每次都将这个值赋值为0,所以程序就一直认为n1一直没有被初始化过,并每次都初始化一次。看一下内存,就更明了了:
0x00E8716C 03 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 b0 e7 1e 6a 00 00 00
这里的内存地址就是静态变量n1的地址,值是3,后面还有一个1,你看到了吗,这个就是程序用来记录该静态变量是否初始化的标识位啦。现在你一定明白原理了,并且能轻松记住静态变量的特性了吧。
以上代码有一点需要说明:代码中之所以要用int initNum = 3;而不是直接用static int n1 = 3;是因为如果给静态变量直接赋值一个常量的话,编译器会进行优化,导致程序在一启动时,就初始化好了,不便于我们观察静态变量内存上的改变。


上一篇
《我的第一本算法书》知识总结 《我的第一本算法书》知识总结
安全算法概论用互联网传输数据时可能会发生的四个主要问题1.窃听: A向B发送的消息在传输途中被X偷看 2.假冒: A以为向B发送了信息,但B可能是X冒充的 B以为A收到了信息,A可能是X冒充的 3.篡改: B确实收到了A发送的信息,但可能在
2018-12-05
下一篇
js的基本操作 js的基本操作
定义变量声明var 变量名; 即使不声明也可以使用,先声明后使用更规范 定义函数声明function 函数名 {} 使用函数名(); 如何输出空格在写JS代码的时候,大家可以会发现这样现象: document.write(“ 1
2018-11-29
目录