gcc structures

Jonathan Wakely jwakely.gcc@gmail.com
Sun Sep 8 12:30:00 GMT 2013


On 8 September 2013 11:10, JimJoycewrote:
> Is this a bug?

No.

> I'm coding in plain 'C'.
> I am trying to read and write GIS shapefiles.
> They start with a header of 9 ints and 8 doubles.
>
> So I used a structure eg:
> struct hdr { int g1[9]; double g2[8] }; struc;
>  fread ( struc, 100, 1, fp1);
> It was screwing up my doubles.
> --
> When, eventually, I experimented:
> sizeof(g1); sizeof(g2), sizeof (struc).
> I got 36, 64, 104.
> Note 104, not 100.
>
> Where is gcc placing the redundant 4 bytes?

Between the two arrays. The array of doubles is 8-byte aligned,
presumably because that's what your architecture requires.

> Is 'struct' insisting on a doubleword boundary?

For the double array, yes.  The C standard doesn't say struct members
must be adjacent, padding is allowed.

> NB I got round the problem by using 2 fread()s
> fread(struc.g1,36,1,fp1);
> fread(struc.g2,64,1,fp1);

That's the right thing to do.

You could also try this:

struct __attribute__((__packed__)) hdr { int g1[9]; double g2[8]; };

Although the compiler adds the padding for good reasons so it's best
not to force it to use a different layout unless you really need to.



More information about the Gcc-help mailing list