Выделение памяти под структуру - 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, что означает успешный конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д