9

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;

私の問題は、私が本当に理解していない構造の pad[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 で警告を生成する

エラー配列添字が配列範囲を超えています

誰かがこれが何を意味するのか説明できますか?

ありがとう

4

4 に答える 4

9

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

また、この配列の 5 番目の要素ではなく、最初の要素へのポインタを返したいようです。したがって、関数を次のように書き直す必要があります。

uint32_t * get_pad_5( a_structure * my_struct)
{
    return my_struct->pad;
}
于 2012-10-08T16:12:49.113 に答える
5

5 つのメンバーを含む配列を作成すると、0 ~ 4 のインデックスが付けられます。5 にアクセスしようとすると、範囲外になります。

于 2012-10-08T15:49:41.427 に答える
2

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

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

この警告は、配列外の要素にアクセスしようとしていることを意味します。のインデックスは56 番目の要素を意味し、配列には 5 つの要素しかありません。

于 2012-10-08T15:52:37.820 に答える
1

5 つの要素の配列には、インデックス0123、および があり4ます。インデックス5が範囲外です。0一般に、N 個の要素の配列には からまでの有効なインデックスがありますN-1

于 2012-10-08T15:50:01.720 に答える