Natural alignment of 32-bit values within structures (gcc 3.4.1)
2004-11-30 by dpbevin2k
I've got a problem accessing 32-bit values within nested structures
using gcc 3.4.1.
I don't know whether it is a problem with compiler flags or because
the output object is fairly large (600Kb) or whether it is because the
nested structure is quite complicated (see below).
Having debugged the source, I can see that a 32-bit value within the
structure is not aligned to a 32-bit boundary (only 16-bit) and
therefore, the STR operation on that element fails.
The structures are as follows:-
<-- BEGIN CODE -->
typedef unsigned char UBYTE;
typedef unsigned short UWORD;
typedef unsigned long ULONG;
typedef enum
{
ENUM_ONE,
ENUM_TWO,
ENUM_THREE,
ENUM_FOUR
} SOME_ENUMS;
typedef union
{
float alg_val;
ULONG dig_val;
struct
{
UBYTE fourA;
UBYTE fourB;
UWORD fourC;
} indirect;
} OBJECT_FOUR;
typedef struct
{
OBJECT_FOUR twoA;
OBJECT_FOUR twoB;
OBJECT_FOUR twoC;
OBJECT_FOUR twoD;
OBJECT_FOUR twoE;
UBYTE twoF;
} OBJECT_TWO;
typedef struct
{
SOME_ENUMS threeA;
UBYTE threeB;
UWORD threeC;
OBJECT_FOUR threeD;
ULONG threeE;
ULONG threeF;
OBJECT_FOUR threeG;
UBYTE threeH;
UBYTE threeJ;
} OBJECT_THREE;
typedef struct
{
UWORD oneA;
OBJECT_TWO oneB;
UBYTE oneC;
OBJECT_THREE oneD;
} OBJECT_ONE;
<-- END CODE -->
When I use a pointer to an OBJECT_ONE object, any accesses to members
within oneB (OBJECT_TWO) fail because the compiler hasn't put a
two-byte pad between oneA and oneB (to preserve natural aligment).
Any help would be greatly appreciated.
Thanks in advance.
David Bevin