Выделение памяти под структуру - C (СИ) (69901)
Формулировка задачи:
Как известно компилятор применяет выравнивание данных для структуры.
Мне интересно, в том случае, когда память для структуры выделяется динамически, в таком случае данные в памяти располагаются плотно и без учета выравнивания и нужно ли обеспечивать выравнивание при помощи специальных явных padding полей для структуры?
Вот, в этом случае, нужно ли обеспечить выравнивание явно при помощи явных padding полей?
http://rextester.com/UQDA99254
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- struct Animal
- {
- const char *name;
- int age;
- } Animal;
- int main()
- {
- struct Animal *dog = malloc(sizeof(Animal));
- dog->name = "Spike";
- dog->age = 3;
- }
Решение задачи: «Выделение памяти под структуру»
textual
Листинг программы
- #include<stdio.h>
- #include<stdlib.h>
- const char ty = 'p';
- const char name[] = "lion";
- typedef struct animal
- {
- char type;
- const char *name;
- } animal_t;
- int main()
- {
- animal_t* struct_data;
- char* raw_data;
- void* raw_mem;
- raw_mem = malloc(sizeof(animal_t));
- struct_data = raw_mem;
- raw_data = raw_mem;
- *raw_data = ty;
- raw_data += sizeof ty;
- raw_data = name;
- printf("type: %c, name: %s\n", struct_data->type, struct_data->name);
- free(raw_mem);
- return 0;
- }
Объяснение кода листинга программы
- Подключение необходимых библиотек: stdlib.h, для работы с памятью, и printf.h, для вывода информации на экран.
- Объявление констант: 'ty' - тип животного, и 'name' - имя животного.
- Создание структуры 'animal_t', которая содержит два поля: 'type' - тип животного (символьный), и 'name' - имя животного (указатель на символьный массив).
- Объявление переменных: 'struct_data' - указатель на структуру 'animal_t', и 'raw_data' - указатель на сырые данные (выделенную память).
- Выделение памяти под структуру 'animal_t' с помощью функции malloc().
- Присваивание указателю 'raw_mem' адреса выделенной памяти.
- Присваивание указателю 'struct_data' адреса выделенной памяти.
- Присваивание указателю 'raw_data' адреса выделенной памяти.
- Запись значения константы 'ty' в память по адресу 'raw_data'.
- Индексация указателя 'raw_data' на размер константы 'ty' для перехода к следующему полю структуры.
- Запись значения константы 'name' в память по адресу 'raw_data'.
- Вывод на экран значений полей структуры 'animal_t', используя указатель 'struct_data'.
- Освобождение выделенной памяти с помощью функции free().
- Возврат 0, что означает успешный конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д