C: Anbefalt stil for dynamisk størrelse structs

stemmer
9

Jeg trenger å overføre pakker via internett hvis lengde bør være dynamisk.

struct packet
{
  int id;
  int filename_len;
  char filename[];
};

Problemet er at null-lengde arrays er ikke ISO-kompatibel.

Bør jeg bruke char filename[1];i stedet? Men da sizeof(struct packet)vil ikke returnere riktig verdi lenger.

Publisert på 26/05/2009 klokken 13:29
kilden bruker
På andre språk...                            


4 svar

stemmer
6

Classic problemet. Du kan bare forholde seg til det (og merk at sizeof (foo) kan være feil med mer enn en hvis kompilatoren runder strukturen størrelse opp, som er (tror jeg) tillatt), eller du kan gjøre noe sånt som dette:

struct packetheader {
   int id;
   int filename_len;
};
struct packet {
   struct packetheader h;
   char filename[1];
};

Dette er irriterende (du må bruke h.id, etc), men det fungerer. Vanligvis jeg bare forholde seg til det å være en, men de ovennevnte kan være marginalt mer portable.

Svarte 26/05/2009 kl. 14:00
kilden bruker

stemmer
6

Jeg tror du bør se på noen eksisterende eksempler på dynamisk størrelse strukturer for veiledning her. Det beste eksemplet jeg vet om er Tegnet APIer i Win32. De bruker makro ANYSIZE_ARRAY som bare løser ned til 1. Raymond Chen gjorde en omfattende blogg-artikkel detaljering nøyaktig hvorfor de er gjort på denne måten

Som for operasjoner som sizeof sviktende. Dette vil mislykkes uansett hvilken løsning du velger for en dynamisk størrelse struct. sizeof er en kompilering operasjon, og du vil bli re-sizing strukturen under kjøring. Det rett og slett ikke kan arbeide.

Svarte 26/05/2009 kl. 13:35
kilden bruker

stemmer
4

Jeg foreslår å bruke char filename[1]og inkludere en terminerende 0-byte. På denne måten kan du malloc()riktig struktur størrelse og unngå engangs feil som dette:

ptr = malloc(sizeof(struct packet)+filename_len);
strncpy(&ptr->filename, filename, filename_len);

Men mottakeren must å vite at det er behov for å lese filename_len+1bytes.

Svarte 26/05/2009 kl. 13:41
kilden bruker

stemmer
3

Faktisk null-lengde arrays er ikke en del av standarden. Men hva du har i kodebiten er en fleksibel matrise som er en del av ISO C99-standarden. Hvis det er mulig for deg å bruke C99, vil jeg bruke en fleksibel array, om ikke Jesup forslag er trolig den beste.

Svarte 26/05/2009 kl. 15:37
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more