This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

create a packed struct

Long story short, I need to create a packed struct.

I knew the pragma way, to change aligment, didn't work. I looked up and found the __packed (I'm using Keil µVision) here: www.keil.com/.../armcc_chr1359124229695.htm

So in the end, here's my theoritically bulletproof code:

#pragma pack(push)
#pragma pack(1)

__packed struct PackedStructure
{
  __packed uint16_t packedValue;
};

#pragma pack(pop)

And now what does sizeof(struct PackedStructure) return ? 4...

Note I've tried pretty much any combination of pragma pack and __packed on structure/member, with always the same result.

And this:

typedef __packed __attribute__((packed)) __attribute__((aligned(1))) struct
{
  __packed uint16_t packedValue;
  __packed uint16_t packedValue2;
} Event;

Gives me a size of 8.

Anyone can tell me how to get a packed structure? Thanks!

Parents
  • @Jonathan I've checked this on x64 using gcc, nRF52 using both Keil and gcc and Raspberry pi using gcc. Each time following code:

    typedef struct
    {
    	uint16_t test;
    } short_single_t;
    
    typedef struct
    {
    	uint16_t test;
    	uint16_t test2;
    } short_double_t;
    
    struct PackedStructure
    {
      uint16_t packedValue;
    };
    
    #ifdef NRF52
    #define printf NRF_LOG_INFO
    #endif
    
    static void struct_size_test(void)
    {
    	printf("sizeof(short_single_t)==%zu\n",sizeof(short_single_t));
    	printf("sizeof(short_double_t)==%zu\n",sizeof(short_double_t));
    	printf("sizeof(struct PackedStructure)==%zu\n",sizeof(struct PackedStructure));
    }
    

    gives me this result:

    sizeof(short_single_t)==2
    sizeof(short_double_t)==4
    sizeof(struct PackedStructure)==2
    

    According to this guide behavior I see is mandated by C standard. Shorts (uint16_t is short) are self-aligned to 2 byte boundary so struct containing only shorts will have 2 byte alignment and no padding.

  • Left that problem aside for a little while, and now when getting back to it, packed structures are packed. No clue what solved it, besides that as shown by the answer I'm commenting, it should not have happened in first place.

Reply Children
No Data
Related