返回信息流函数
a()
{
static int i=0;
printf("i=%d",i);
i=1;
}
为了说明我的问题,我随便写了一段代码
第一运行a时,显示i=0,本意是第二次运行a时显示i=1
这样的话,函数内部第一局声明i=0就不起作用吗?
为什么?
这是一条镜像帖。来源:北邮人论坛 / cpp / #14049同步于 2008/10/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
static 变量
dinoxxx
2008/10/15镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
#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
上面这段代码和下面的这段效果上是一样的。
int i = 0;
void a() {
printf("%d\n", i);
i = 1;
}
i 实际上是定义在静态存储区的,并不是在a的栈上。
它和全局变量的唯一区别就是,函数内部的static变量只能在函数内部被使用。
而全局变量可以在其他的函数中被使用。
说到底是命名空间、作用域和存储位置几个不同的概念。
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()
: {
: ...................