Как члены структуры размещаются в памяти?

c memory-management struct

12735 просмотра

3 ответа

Пытаясь создать менеджер памяти для будущих программ на Си, я столкнулся с этим вопросом:

msgstr "при размещении структур хранятся ли их поля-члены в указанном порядке?"

Например, рассмотрим следующую структуру.

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

Будут ли выделены адреса памяти полей в следующем порядке: field1, field2, field3? Или это не гарантировано?

Автор: Douglas Adam Smith II Источник Размещён: 12.11.2019 09:25

Ответы (3)


27 плюса

Решение

Краткий ответ : они располагаются в порядке, как они объявлены в структуре.


Пример :

#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;
}

Выход :

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

Наглядное представление вышеупомянутого распределения памяти структуры дано ниже. Эта диаграмма поможет вам понять концепцию распределения памяти в C очень легко.

введите описание изображения здесь


Дальнейшее чтение : проверьте здесь (также источник для приведенного выше примера) для C – Structure Paddingи Structure dynamic memory allocation in C.

Автор: herohuyongtao Размещён: 23.12.2013 04:58

6 плюса

Вам гарантировано, что field3идет после того field2, что идет после field1, и это field1в начале памяти (т.е. до этого нет заполнения field1). Тем не менее, они могут быть между другими членами (и даже после field3). Короче говоря, порядок, в котором они объявляются, является порядком, в котором они размещены в памяти, хотя точное выравнивание и заполнение определяются реализацией (но до первого члена дополнения не будет).

Автор: Cornstalks Размещён: 23.12.2013 04:56

0 плюса

  1. Члены расположены один за другим;
  2. Начальное местоположение каждого участника должно делиться точно на его длину:

Например:

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

Первое расположение структуры: x:

длина поля field1 равна 1 (байт), filed2 равно 4, field3 равно 8

поэтому field1 находится в точке x + 0, field2 находится в точке x + 4 ~ x + 7, field3 находится в точке x + 8 ~ x + 15, а x + 1 ~ x + 3 дополняется, чтобы поле field2 находилось в нужном месте.

И длина всей структуры должна делиться именно на ее самый большой член; если нет, то добавляем несколько байтов до конца.

Автор: SliceSort Размещён: 23.12.2013 05:15
Вопросы из категории :
32x32