Выделение памяти под структуру - C (СИ) (69901)

Узнай цену своей работы

Формулировка задачи:

Как известно компилятор применяет выравнивание данных для структуры. Мне интересно, в том случае, когда память для структуры выделяется динамически, в таком случае данные в памяти располагаются плотно и без учета выравнивания и нужно ли обеспечивать выравнивание при помощи специальных явных padding полей для структуры? Вот, в этом случае, нужно ли обеспечить выравнивание явно при помощи явных padding полей?
#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;
}
http://rextester.com/UQDA99254

Решение задачи: «Выделение памяти под структуру»

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

Объяснение кода листинга программы

  1. Подключение необходимых библиотек: stdlib.h, для работы с памятью, и printf.h, для вывода информации на экран.
  2. Объявление констант: 'ty' - тип животного, и 'name' - имя животного.
  3. Создание структуры 'animal_t', которая содержит два поля: 'type' - тип животного (символьный), и 'name' - имя животного (указатель на символьный массив).
  4. Объявление переменных: 'struct_data' - указатель на структуру 'animal_t', и 'raw_data' - указатель на сырые данные (выделенную память).
  5. Выделение памяти под структуру 'animal_t' с помощью функции malloc().
  6. Присваивание указателю 'raw_mem' адреса выделенной памяти.
  7. Присваивание указателю 'struct_data' адреса выделенной памяти.
  8. Присваивание указателю 'raw_data' адреса выделенной памяти.
  9. Запись значения константы 'ty' в память по адресу 'raw_data'.
  10. Индексация указателя 'raw_data' на размер константы 'ty' для перехода к следующему полю структуры.
  11. Запись значения константы 'name' в память по адресу 'raw_data'.
  12. Вывод на экран значений полей структуры 'animal_t', используя указатель 'struct_data'.
  13. Освобождение выделенной памяти с помощью функции free().
  14. Возврат 0, что означает успешный конец работы программы.

Оцени полезность:

15   голосов , оценка 3.733 из 5
Похожие ответы