2010-11-20 11 views
10

Che cos'è IDiling array Idiom?Trailing Array Idiom

P.S: Googling questo termine fornisce I vettori vengono implementati utilizzando l'idioma di array finale, quindi non sono ridimensionabili senza modificare l'indirizzo dell'oggetto vettoriale stesso.

+0

Come altri hanno commentato alcune risposte qui sotto, avresti miglior fortuna nella ricerca di _flexible array member_. – ninjalj

+0

Si noti che, per definizione rigorosa, ciò richiama _UB_: http://stackoverflow.com/questions/3711233/is-the-struct-hack-technically-undefined-behavior – sbi

risposta

10

Se si intende il linguaggio di matrice finale menzionato nel GCC source code (dove il tuo preventivo viene), sembra riferirsi al vecchio C trucco per implementare un array dinamico:

typedef struct { 
    /* header */ 
    size_t nelems; 

    /* actual array */ 
    int a[1]; 
} IntVector; 

dove una matrice sarebbe creata con

IntVector *make_intvector(size_t n) 
{ 
    IntVector *v = malloc(sizeof(IntVector) + sizeof(int) * (n-1)); 
    if (v != NULL) 
     v->nelems = n; 
    return v; 
} 
+3

Se si riferisce a questo, il termine più comune è [struct hack] (http://stackoverflow.com/q/3711233/168225). –

+0

@Georg: Non penso (anche se non sono sicuro) si riferisce a questo altrimenti il ​​termine (come hai detto) 'struct hack' sarebbe stato usato al posto di 'Trailing array idiom'. –

+0

@Prasoon: l'autore potrebbe aver appena usato un termine diverso, non sarebbe la prima volta che qualcuno lo ha fatto. "Struct hack" suona comunque un po 'informale. –

1

Sembra fare riferimento agli array nelle strutture, che possono avere una matrice variabile. Vedi:

http://blogs.msdn.com/b/oldnewthing/archive/2004/08/26/220873.aspx e http://sourceware.org/gdb/current/onlinedocs/gdbint/Support-Libraries.html

Un altro suggerimento, se google per un'espressione messo l'espressione in "" come "trailing allineamento" questo vi darà risultati più specifici. Google conosce gli array finali.

+0

+1 per il collegamento all'articolo MSDN, elementi interessanti . –

1

Penso che quello che si intende è:

struct foo { 
    ... some data members, maybe the length of bar ... 
    char bar[]; /* last member of foo, char is just an example */ 
}; 

Viene utilizzato allocando con malloc(sizeof(struct foo)+LEN), dove LEN è la lunghezza desiderata di bar. In questo modo è necessario solo un malloc. [] può essere utilizzato solo con l'ultimo membro della struttura.

E, per quanto comprendo il documento GCC, struct foo può essere utilizzato (ragionevolmente) solo come ultimo membro di un'altra struttura, poiché la dimensione di archiviazione non è fissa, o come puntatore.

+0

Questo è chiamato "membro di array flessibile" ed è nello standard C99 (§6.7.2.1P16). – aib

Problemi correlati