Как члены структуры размещаются в памяти?
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
.
6 плюса
Вам гарантировано, что field3
идет после того field2
, что идет после field1
, и это field1
в начале памяти (т.е. до этого нет заполнения field1
). Тем не менее, они могут быть между другими членами (и даже после field3
). Короче говоря, порядок, в котором они объявляются, является порядком, в котором они размещены в памяти, хотя точное выравнивание и заполнение определяются реализацией (но до первого члена дополнения не будет).
0 плюса
- Члены расположены один за другим;
- Начальное местоположение каждого участника должно делиться точно на его длину:
Например:
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Вопросы из категории :
- c Как вы форматируете unsigned long long int, используя printf?
- c What are the barriers to understanding pointers and what can be done to overcome them?
- c Как реализовать продолжения?
- c Как вы передаете функцию в качестве параметра в C?
- c Как получить список каталогов в C?
- c В чем разница между #include <filename> и #include "filename"?
- memory-management Setting Objects to Null/Nothing after use in .NET
- memory-management Как работает пул автозапуска NSAutoreleasePool?
- memory-management Что и где находится стек и куча?
- memory-management Как имитировать ошибки выделения памяти
- memory-management Что такого плохого в использовании GC.Collect ()?
- memory-management Инструменты обнаружения утечки памяти
- struct В чем разница между структурой и классом в .NET?
- struct Когда вы должны использовать класс против структуры в C ++?
- struct Каковы различия между структурой и классом в C ++?
- struct Why isn't sizeof for a struct equal to the sum of sizeof of each member?
- struct Почему мы не можем инициализировать элементы внутри структуры?
- struct Why should we typedef a struct so often in C?