Come includere un array dinamico ALL'INTERNO di una struttura in C?

Come includere un array dinamico ALL'INTERNO di una struttura in C?


Mi sono guardato intorno ma non sono riuscito a trovare una soluzione a quella che deve essere una domanda ben posta.
Ecco il codice che ho:


 #include <stdlib.h>
struct my_struct {
int n;
char s[]
};
int main()
{
struct my_struct ms;
ms.s = malloc(sizeof(char*)*50);
}

ed ecco l'errore che mi dà gcc:
errore:uso non valido del membro dell'array flessibile


Posso farlo compilare se dichiaro che la dichiarazione di s all'interno della struttura è


char* s

e questa è probabilmente un'implementazione superiore (l'aritmetica del puntatore è più veloce degli array, sì?)
ma ho pensato in c a una dichiarazione di


char s[]

è uguale a


char* s

Risposte:


Il modo in cui l'hai scritto ora, era chiamato "struct hack", fino a quando C99 non lo ha benedetto come "membro dell'array flessibile". Il motivo per cui ricevi un errore (probabilmente comunque) è che deve essere seguito da un punto e virgola:


#include <stdlib.h>
struct my_struct {
int n;
char s[];
};

Quando si alloca spazio per questo, si desidera allocare la dimensione della struttura plus la quantità di spazio che desideri per l'array:


struct my_struct *s = malloc(sizeof(struct my_struct) + 50);

In questo caso, il membro dell'array flessibile è un array di char e sizeof(char)==1, quindi non è necessario moltiplicare per le sue dimensioni, ma proprio come qualsiasi altro malloc di cui avresti bisogno se fosse un array di qualche altro tipo:


struct dyn_array { 
int size;
int data[];
};
struct dyn_array* my_array = malloc(sizeof(struct dyn_array) + 100 * sizeof(int));

Modifica:questo dà un risultato diverso dalla modifica del membro in un puntatore. In tal caso, sono necessarie (normalmente) due allocazioni separate, una per la struttura stessa e una per i dati "extra" a cui puntare il puntatore. Utilizzando un membro dell'array flessibile puoi allocare tutti i dati in un unico blocco.