静态存储区

来源:百度知道 编辑:UC知道 时间:2024/06/04 11:20:59
问下:全局变量放在全局数据区,那函数里面的变量是放在栈区,如果给局部变量声明static,那它在内存区的位置是什么?比如:
int a
main()
{
static int a=1;
}
void
{
static int a=2;
}
三个a 会冲突吗?能不能分别说下是怎么存储的

3个a不会冲突。

这里涉及几个方面的知识:
1. 全局变量和静态数据放在静态存储区,生命周期为从申请到程序退出。因此局部变量若定义为static,则存储在静态存储区,否则存储在函数的栈内,生命周期为本函数内。
2. 全局变量和局部变量的作用域,全局变量为从申请到整个程序结束,局部变量为从申请到本{}范围内。
3. 局部变量对全局变量的屏蔽。若在本函数内定义的变量与全局变量同名,则将全局变量屏蔽,使用时为内部定义的局部变量。
4. 定义为static类型的局部变量,再次进入该函数,可以使用保留的结果。

下面的程序可以帮助理解:
#include<stdio.h>

int a = 1;

void fun()
{
static int a =3;
int b = 1;
printf("%d, %d\n", a, b);

a++;
b++;
}

int main()
{
printf("%d\n", a); /* global a */

static int a = 2;

printf("%d\n", a); /* static a in main */

fun(); /* static a in fun */
fun(); /* static a in fun */

return 0;
}

运行结果为:
1 /* 全局变量a */
2 /* 因为定义了main内的局部变量static int a,全局变量a被屏蔽,打印的为main局部变量a */
3, 1 /* 因为定义了fun内的局