2012-07-31 77 views
38

當我在尋找的Linux內核代碼,找到下面的代碼:結構中長度爲零的數組的目的是什麼?

struct thread_info { 
    struct task_struct *task; 
    struct exec_domain *exec_domain; 
    unsigned long  flags; 
    __u32   status; 
    __u32   cpu; 
    int   preempt_count; 
    mm_segment_t  addr_limit; 
    struct restart_block restart_block; 
    void __user  *sysenter_return; 
    unsigned long   previous_esp; 
    __u8   supervisor_stack[0]; 
}; 

注意,最後一個變量「supervisor_stack」,它是一個零長度的數組,什麼是它的使用?提前致謝!

+0

我認爲認爲這意味着零長度數組,我認爲,這意味着它是獲得或檢索數組的第一個值。 – 2012-07-31 05:58:33

回答

32

這是一個柔性陣列構件,通過GCC提供作爲擴展的預C99版本。

的C99的方法是用空括號限定柔性陣列構件,

__u8 supervisor_stack[]; 

它用於存儲數據,其量不是恆定的鄰接結構。存儲器在形式

struct foo *ptr = malloc(sizeof *ptr + whatever_is_needed); 

在第6.7.2.1的分配18,標準(草案N1570)描述它們:

作爲一個特殊的情況下,結構的超過的最後一個元素一個名爲成員可能 有一個不完整的數組類型;這被稱爲靈活的數組成員。在大多數情況下,彈性數組成員被忽略。特別地,該結構的大小是因爲如果 柔性陣列構件,不同的是它可以具有更多拖尾填充比 省略遺漏將意味着。但是,如果.(或->)運算符的左操作數爲 (指向)具有靈活數組成員的結構,並且右操作數名稱爲 成員,則其行爲與該成員被替換爲最長陣列(使用相同的 元素類型)不會使結構大於被訪問的對象;所述 陣列的偏移應保持該柔性陣列構件的,即使這會從該替換陣列的不同 。如果這個數組就沒有的元素,它的行爲就好像 它有一個元素,但該行爲是不確定的,如果任何試圖訪問該 元素或產生一個指向一個過去吧。

6
+1

最廉價的正確答案我看到的計算器永遠:d – Gewure 2017-03-01 14:55:34

+0

雖然此鏈接可以回答這個問題,最好是在這裏有答案的主要部件,並提供鏈接以供參考。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/19065624) – grizzthedj 2018-03-10 11:22:25

7

這是一個常見的C劈聲明什麼可以被稱爲可變長度陣列(你在哪裏分配時間限定大小

實施例:

struct line { 
    int length; 
    char contents[0]; 
}; 

struct line *thisline = (struct line *) 
    malloc (sizeof (struct line) + this_length); 
thisline->length = this_length; 

這樣你具有這樣的結構數據,其也存儲用於明顯convecience目的數組長度,但你不是由通常與一個結構從採取

實施例相關聯的固定大小約束的定義(在那裏也詳細信息)

相關問題