How are struct members allocated in memory?

You are guaranteed that field3 comes after field2, which comes after field1, and that field1 is at the start of the memory (i.e. there's no padding before field1). However, they may be padding in between the other members (and even after field3). In short, the order in which they are declared is the order in which they are laid out in memory, though exact alignment and padding is implementation defined (but there won't be any padding before the first member).


Short answer: they are allocated with the order as they declared in the struct.


Example:

#include <stdio.h>
#include <string.h>

struct student 
{
    int id1;
    int id2;
    char a;
    char b;
    float percentage;
};

int main() 
{
    int i;
    struct student record1 = {1, 2, 'A', 'B', 90.5};

    printf("size of structure in bytes : %d\n", 
        sizeof(record1));

    printf("\nAddress of id1        = %u", &record1.id1 );
    printf("\nAddress of id2        = %u", &record1.id2 );
    printf("\nAddress of a          = %u", &record1.a );
    printf("\nAddress of b          = %u", &record1.b );
    printf("\nAddress of percentage = %u",&record1.percentage);

    return 0;
}

Output:

size of structure in bytes : 16 
Address of id1 = 675376768
Address of id2 = 675376772
Address of a = 675376776
Address of b = 675376777
Address of percentage = 675376780

The pictorial representation of above structure memory allocation is given below. This diagram will help you to understand the memory allocation concept in C very easily.

enter image description here


Further reading: check out here (also the source for the above example) for C – Structure Padding and Structure dynamic memory allocation in C.