Una struttura con un membro di matrice flessibile, apparentemente, non è destinata a essere dichiarata, ma piuttosto utilizzata in combinazione con un puntatore a tale struttura. Quando si dichiara un membro di array flessibile, deve esserci almeno un altro membro e il membro di matrice flessibile deve essere l'ultimo membro di quella struttura.I membri di array flessibili sono davvero necessari?
Diciamo che ho uno che assomiglia a questo:
struct example{
int n;
int flm[];
}
quindi di usarlo, dovrò dichiarare un puntatore e utilizzare malloc per riservare la memoria per i contenuti della struttura.
struct example *ptr = malloc(sizeof(struct example) + 5*sizeof(int));
Cioè, se voglio che il mio array flm [] contenga cinque interi. Poi, posso solo usare il mio struct in questo modo:
ptr->flm[0] = 1;
La mia domanda è, non dovrei essere in grado di utilizzare solo un puntatore invece di questo? Non solo sarebbe pre-C99 compatibile, ma potrei usarlo con o senza un puntatore a quella struttura. Considerando che devo già usare malloc con il flm, non dovrei essere in grado di farlo?
Considerare questa nuova definizione della struttura di esempio;
struct example{
int n;
int *notflm;
}
struct example test = {4, malloc(sizeof(int) * 5)};
Mi piacerebbe anche essere in grado di utilizzare la sostituzione allo stesso modo come il membro di matrice flessibile:
Sarebbe anche questo lavoro? (Fornita la precedente definizione di esempio con notflm)
struct example test;
test.n = 4;
notflm = malloc(sizeof(int) * 5);
possibile duplicato di [membri di array flessibili in C - cattivo?] (Http://stackoverflow.com/questions/246977/flexible-array-members-in-c-bad). Gli array flessibili fanno parte di C99; i puntatori non sono e possono avere problemi di portabilità. –
La differenza principale è che i membri di array flessibili consentono di allocare l'intera struttura in un blocco contiguo. Se vuoi copiare la struttura, calcola la sua dimensione e fai una copia. Mentre con un puntatore, devi copiare la struttura stessa, ma poi anche copiare l'array interno. –
@TedHopp in che modo possibile potresti seriamente dire che i puntatori non fanno parte del C99? –