2012-10-08 8 views
5

Ho un per affrontare con una struttura di un lib:C e gcc indice di matrice errore è al di sopra di matrice delimita

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; 

il mio problema viene dal pad [5] membro della struttura che non lo faccio capisco davvero. I thougth questo utente può essere utilizzato come l'altro membro in funzione del genere:

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

ma questa funzione:

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

generare avvertimento in gcc

errore indice di matrice è sopra limiti di serie

Qualcuno può spiegare n me cosa significa?

Thxs

+0

ho avuto un codice abbastanza convoluzione che gcc è riuscito a capire e ha avvertito "serie errore di indice è al di sopra limiti di matrice Così, anche se il problema posto era ovvio, trovare questo. (a causa dell'avviso di corrispondenza pubblicato) ha aiutato a risolvere il mio problema più complesso – chux

risposta

6

Il campo struttura pad è stato definito come "matrice di 5 uint32_t". È necessario differenziare la definizione della variabile dall'uso della variabile. Quindi, dal momento che lo pad è definito, pad[5] significa "ottieni il quinto elemento (numero da 0) della serie pad". Ma non esiste alcun elemento di questo tipo nella matrice pad, perché l'indice più alto disponibile per questo array è 4.

Inoltre, sembra che si desideri restituire il puntatore al primo elemento di questo array, non al quinto elemento. Quindi è necessario riscrivere la funzione in questo modo:

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

Da cosa concludi che l'OP è interessato al primo elemento? – alk

+1

@alk OP vuole trattare con "membro pad [5]". non capisce l'indicizzazione dell'array (non c'è un quinto elemento nella matrice 'pad') o una definizione/uso di un array/puntatore (il membro della struttura è' pad', non 'pad [5]'). E credo anche che il il secondo problema crea molta più confusione per un principiante. – ThomasMore

5

Quando si crea un array con 5 membri, essi ottenere indicizzati 0-4, se si tenta di acces 5, sei fuori dai limiti

1

Una serie di 5 elementi ha indici 0 , 1, 2, 3 e 4. L'indice 5 è fuori dai limiti. In generale una serie di elementi N ha indici validi da 0 a N-1 inclusi.

2

Le matrici in C sono basate su zero.

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

L'avviso indica che si sta tentando di accedere a un elemento all'esterno dell'array. Un indice di 5 significa l'elemento sesto e l'array ha solo 5 elementi.

Problemi correlati