2016-02-26 69 views
-3

雖然我正在查看Linux設備驅動程序代碼,我發現下面的代碼,我不明白爲什麼他們提到像靜態結構。結構和靜態結構有什麼區別?

static struct resource imx_uart1_resources[] = { 
[0] = { 
    .start = 0x00206000, 
    .end = 0x002060FF, 
    .flags = IORESOURCE_MEM, 
    }, 
[1] = { 
.start = (UART1_MINT_RX), 
.end = (UART1_MINT_RX), 
.flags = IORESOURCE_IRQ, 
    }, 
}; 

任何人都可以解釋什麼是「靜態結構」的需要,並解釋它的必要性?

+1

有很多關於靜態方法的其他例子。至於爲什麼有必要,你沒有顯示足夠的代碼給任何人給你一個答案。 – Joe

+3

可能重複[什麼是「靜態」在C程序中的意思?](http://stackoverflow.com/questions/572547/what-does-static-mean-in-a-c-program) – Joe

+0

沒有@Joe。我的問題是什麼是結構和靜態結構之間的區別小編輯已經作出。 TIA – Photon001

回答

2

關鍵字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相同的數組聲明,那麼每個編譯單元都有自己單獨的數組實例。

+1

你能解釋一下stuct和靜態stuct之間的區別嗎? – Photon001

+0

@Raj查看我更新的帖子。 –

+0

感謝您的回答@Vlad來自莫斯科 – Photon001