Prendiamo il seguente esempio:Comportamento indefinito con type cast?
typedef struct array_struct {
unsigned char* pointer;
size_t length;
} array;
typedef struct vector_struct {
unsigned char* pointer;
// Reserved is the amount of allocated memory not being used.
// MemoryLength = length + reserved;
size_t length, reserved;
} vector;
// Example Usage:
vector* vct = (vector*) calloc(sizeof(vector), 1);
vct->reserved = 0;
vct->length = 24;
vct->pointer = (unsigned char*) calloc(arr->length, 1);
array* arr = (array*) vct;
printf("%i", arr->length);
free(arr->pointer);
free(arr);
C sembra allocare memoria per i membri struct nell'ordine che stanno definiti nel struct. Il che significa che se lanci vector -> array
otterrai comunque gli stessi risultati se esegui operazioni su array
come se lo avessi fatto su vector
poiché hanno gli stessi membri e l'ordine dei membri.
Fintanto che è stato eseguito il cast solo da vector -> array
come se array
fosse un tipo generico per vector
, non si dovrebbe incorrere in alcun problema.
È questo comportamento indefinito e cattivo nonostante la struttura simile dei tipi?
Stai assumendo '' array' e VECTOR' hanno la stessa imbottitura, che non credo è garantita. – Cornstalks
Perché non dovrebbero? Il padding non dovrebbe differire se hanno la stessa struttura. Eventuali imbottiture aggiuntive si troverebbero alla fine, al di fuori della struttura, dove non dovrebbe avere importanza. – FatalSleep
Posso capire perché questo potrebbe essere un comportamento irregolare, ma non sicuro al 100% se non è definito e possiede una minaccia reale. – FatalSleep