简体   繁体   中英

How are struct members allocated in memory?

While attempting to create a memory manager for future C programs, I've come across this question:

"when structs are allocated, are their member fields stored in the order specified?"

For instance, consider the following struct.

typedef struct {
    int field1;
    int field2;
    char field3;
} SomeType;

When allocated, will the memory addresses of the fields be in the order field1, field2, field3? Or is this not guaranteed?

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.

在此处输入图片说明


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

You are guaranteed that field3 comes after field2 , which comes after field1 , and that field1 is at the start of the memory (ie 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).

  1. Members are located one by one;
  2. Every member's start location shoule be divide exactly by its length:

For example:

typedef struct {
   char field1;
   int field2;
   double field3;
} SomeType;

The struct's first location is x:

field1's length is 1(byte), filed2 is 4, field3 is 8

so field1 is at x+0, field2 is at x+4~x+7, field3 is at x+8~x+15, and x+1~x+3 is padded to make field2 at right place.

And the whole struct's length should be divide exactly by its largest member; if not, padding some bytes to the end.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM