關鍵字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