关键字static
有许多含义取决于使用关键字的上下文。
如果结构数组是在函数内部声明的,那么这意味着该数组具有静态存储持续时间而不是自动存储持续时间。
考虑下面的例子
#include <stdio.h>
struct A
{
int x;
};
struct A * f(void)
{
struct A a = { 10 };
return &a;
}
int main(void)
{
struct A *pa = f();
printf("pa->x = ");
printf("%d\n", pa->x);
}
这里起作用f
定义struct A
类型的对象与所述自动存储持续时间,并返回指针到该对象。由于该对象在退出该功能后不会活着,因此该程序具有未定义的行为。例如使用内联的编译器在运行此程序我得到了以下结果
pa->x = 1073981248
在另一方面,如果函数内的对象将具有静态存储持续时间,则程序将合式因为对象预订购是活着退出函数
#include <stdio.h>
struct A
{
int x;
};
struct A * f(void)
{
static struct A a = { 10 };
return &a;
}
int main(void)
{
struct A *pa = f();
printf("pa->x = ");
printf("%d\n", pa->x);
}
程序输出将如预期
pa->x = 10
对象将保持理论值的调用之间的它的值之后e功能。例如
#include <stdio.h>
struct A
{
int x;
};
struct A * f(void)
{
static struct A a = { 10 };
return &a;
}
int main(void)
{
struct A *pa = f();
printf("pa->x = ");
printf("%d\n", pa->x);
pa->x = 20;
pa = f();
printf("pa->x = ");
printf("%d\n", pa->x);
}
程序输出是
pa->x = 10
pa->x = 20
如果结构的阵列的任何函数之外声明则表示(除了默认静态存储持续时间)阵列名称具有内部这种联系在宣布它的编制单位之外是不可见的。
如果多个编译单元包含与关键字static相同的数组声明,那么每个编译单元都有自己单独的数组实例。
有很多关于静态方法的其他例子。至于为什么有必要,你没有显示足够的代码给任何人给你一个答案。 – Joe
可能重复[什么是“静态”在C程序中的意思?](http://stackoverflow.com/questions/572547/what-does-static-mean-in-a-c-program) – Joe
没有@Joe。我的问题是什么是结构和静态结构之间的区别小编辑已经作出。 TIA – Photon001