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