Finora ci ho pensato, ma dopo aver appreso che il compilatore potrebbe eseguire il rilievo dei dati per allinearlo ai requisiti di architettura, ad esempio, sono in dubbio. Quindi mi chiedo se uno char[4][3]
abbia lo stesso layout di memoria di char[12]
. Il compilatore può inserire il padding dopo la parte char[3]
per renderlo allineato in modo che l'intero array impieghi effettivamente 16 byte?È garantito che il tipo T [x] [y] abbia lo stesso layout di memoria di T [x * y] in C?
La storia di fondo che una funzione di una biblioteca prende un mucchio di stringhe di lunghezza fissa in un parametro char*
quindi si aspetta un buffer continuo senza paddig, e la lunghezza della stringa può essere dispari. Quindi ho pensato di dichiarare un array char[N_STRINGS][STRING_LENGTH]
, quindi popolarlo comodamente e passarlo alla funzione assegnandolo a char*
. Finora sembra funzionare. Ma non sono sicuro che questa soluzione sia portatile.
L'array viene assegnato in modo contiguo. Non ci può essere alcun padding tra gli elementi dell'array IMHO. – ameyCU
Gli array C devono essere contigui, senza padding tra gli elementi dell'array. Quindi né 'char [4] [3]' né 'char [12]' potrebbe contenere padding, e 'sizeof' sarà' 12 * sizeof (char) 'per entrambi. –
Vedere anche [Gli array C possono contenere spaziatura tra gli elementi?] (Http://stackoverflow.com/questions/1066681/can-c-arrays-contain-padding-in-between-elements) –