2012-10-08 46 views
5

我有一個處理一個11b的結構:C和GCC誤差數組下標被上述陣列界定

typedef struct { 
    uint8_t response_type; 
    uint8_t error_code; 
    uint16_t sequence; 
    uint32_t resource_id; 
    uint16_t minor_code; 
    uint8_t major_code; 
    uint8_t pad0; 
    uint32_t pad[5]; 
    uint32_t full_sequence; 
} a_structure; 

我的問題來自於墊[5],我不所述結構的構件真的很明白。 我吼聲此構件可以用作其他部件在功能上類似的:

uint8_t get_response_type(a_structure * my_struct) 
{ 
    return my_struct->response_type; 
} 

但此功能:

uint32_t get_pad_5(a_structure * my_struct) 
{ 
    return my_struct->pad[5]; 
} 

在gcc中產生警告

錯誤數組下標以上是數組邊界

有人可以解釋我是什麼意思?

Thxs

+0

我有一個相當卷積碼是GCC設法弄清楚,並警告「錯誤數組下標是以上數組邊界所以,即使這個職位的問題是顯而易見的,發現這一點。 (因爲發佈了匹配警告)確實有助於解決我更復雜的問題 – chux

回答

6

結構字段pad被定義爲「數組5 uint32_t」。您必須使用變量來區分變量定義。因此,由於pad被定義,因此pad[5]表示「得到pad數組的第五個(從0開始計數)」元素。但pad陣列中沒有這樣的元素,因爲此陣列可用的最高索引是4.

此外,您似乎希望返回指向此數組的第一個元素的指針,而不是第五個元素。所以,你必須這樣重寫你的函數:

uint32_t * get_pad_5(a_structure * my_struct) 
{ 
    return my_struct->pad; 
} 
+0

從哪些方面可以得出結論OP對我的第一個元素感興趣? – alk

+1

@alk OP想要處理「pad [5]成員」,那就是他不理解數組索引(數組中沒有第五個元素)或數組/指針定義/使用(結構成員是pad,而不是pad [5]')。我也相信第二個問題對於新手來說更加混亂。 – ThomasMore

5

當你箱5個成員的陣列,它們被索引0-4,如果你嘗試存取權限5,你出界

1

的5個元素的數組具有索引01,2,34。指數5超出界限。通常,N個元素的陣列具有從0N-1(含)的有效索引。

2

C中的數組基於零。

my_struct->pad[0]; // the first pad 
my_struct->pad[4]; // the fifth pad 

警告意味着您正試圖訪問陣列外部的元素。索引5表示六分之一元素,而數組只有五個元素。