2012-10-08 3 views
5

です:Cとgccのエラー配列の添字は、私はLIBの構造に対処する必要が配列の境界を超える

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]メンバーパッドから来ます本当に理解する。 私はこのメンバーはそのような機能の他の部材として使用することができるthougth:

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に警告を生成配列境界

誰かexplaiそれはどういう意味ですか?

Thxs

+0

私はgccが把握するために管理し、エラー配列の添字が配列の境界を超えている」と警告していることにかなりの畳み込みコードを持っていたこの記事の問題がこれを発見、明らかだったので、にもかかわらず。 – chux

答えて

6

構造体フィールドpadを「配列5 uint32_t」と定義しました。変数の定義と変数の使用法を異ならせる必要があります。したがって、padが定義されているので、pad[5]は、pad配列の5番目の(0から数えて)要素を取得することを意味します。 pad配列にこのような要素はありません。この配列で使用可能な最高のインデックスは4です。

また、この配列の最初の要素にポインタを戻したいと思われます。ですから、この方法あなたの関数を書き換える必要があります。

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

OPはあなたの最初の要素に興味がありますか? – alk

+1

@alk OPは "pad [5] member"に対処したいと思っています。配列のインデックス付け( 'pad'配列では5番目の要素がありません)または配列/ポインタ定義/使用(構造体のメンバは' pad [5] 'ではなく' pad'です)のいずれかを理解できません。 2番目の問題は、初心者のためにはるかに混乱します。 – ThomasMore

5

あなたはクレート5人のメンバーとの配列は、彼らはあなたが5のアクセスもしようとした場合、あなたは境界

1

の外出、0-4のインデックスを取得5つの要素の配列は、インデックス0を持っています1,2,3および4である。インデックス5は範囲外です。一般に、N要素の配列は0からN-1までの有効なインデックスを持っています。

2

Cの配列はゼロベースです。

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

警告は、アレイ外の要素にアクセスしようとしていることを意味します。 5のインデックスは6番目の要素を意味し、配列は5個の要素しか持たない。

関連する問題