BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #14049同步于 2008/10/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

static 变量

dinoxxx
2008/10/15镜像同步12 回复
函数 a() { static int i=0; printf("i=%d",i); i=1; } 为了说明我的问题,我随便写了一段代码 第一运行a时,显示i=0,本意是第二次运行a时显示i=1 这样的话,函数内部第一局声明i=0就不起作用吗? 为什么?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
noname机器人#1 · 2008/10/15
#include<stdio.h> int a() { static int i=0; printf("i=%d",i); i=1; } int main(void) { a(); a(); } [test@bogon foo1]$ ./a.out i=0i=1
dinoxxx机器人#2 · 2008/10/15
我运行没问题,就是想知道为什么,这是重点
Solmyr机器人#3 · 2008/10/15
static定义只执行一次,也就是只有第一次定义是有效的
ericyosho机器人#4 · 2008/10/15
上面这段代码和下面的这段效果上是一样的。 int i = 0; void a() { printf("%d\n", i); i = 1; } i 实际上是定义在静态存储区的,并不是在a的栈上。 它和全局变量的唯一区别就是,函数内部的static变量只能在函数内部被使用。 而全局变量可以在其他的函数中被使用。 说到底是命名空间、作用域和存储位置几个不同的概念。
dinoxxx机器人#5 · 2008/10/15
【 在 Solmyr 的大作中提到: 】 : static定义只执行一次,也就是只有第一次定义是有效的 这个解释说到点子上了
jsea机器人#6 · 2008/10/15
static定义的变量在定义时就初始化了,在编译阶段就已经分配好空间,初始化完成了吧,而且不赋值为0。真正执行时,定义那句就直接跳过了,我觉得。
huyuanmeix机器人#7 · 2008/10/15
静态存储区和堆不一样吧??ls
rebirthatsix机器人#8 · 2008/10/15
是在可读写的.data段里
sunway机器人#9 · 2008/10/15
void a() { static int a=0; printf("i=%d",i); } gcc -c 1.c objdump -d 1.o Disassembly of section .text: 00000000 <a>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 08 sub $0x8,%esp 6: a1 00 00 00 00 mov 0x0,%eax ~~~~~~~~~~~~~~~~将i的地址赋给eax 下一行将eax的值入栈,然后call printf... # i的地址是0x0是因为还没有链接,链接时会换成重定位 后的地址,但这一句说明了对i的引用不是在栈上,实际上i在1.o的.bss段 b: 89 44 24 04 mov %eax,0x4(%esp) f: c7 04 24 00 00 00 00 movl $0x0,(%esp) 16: e8 fc ff ff ff call 17 <a+0x17> 1b: c7 05 00 00 00 00 01 movl $0x1,0x0 22: 00 00 00 25: c9 leave 26: c3 ret 【 在 dinoxxx (匡威代理) 的大作中提到: 】 : 函数 : a() : { : ...................