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

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

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

Как известно компилятор применяет выравнивание данных для структуры. Мне интересно, в том случае, когда память для структуры выделяется динамически, в таком случае данные в памяти располагаются плотно и без учета выравнивания и нужно ли обеспечивать выравнивание при помощи специальных явных padding полей для структуры? Вот, в этом случае, нужно ли обеспечить выравнивание явно при помощи явных padding полей?
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct Animal
  4. {
  5. const char *name;
  6. int age;
  7. } Animal;
  8.  
  9. int main()
  10. {
  11. struct Animal *dog = malloc(sizeof(Animal));
  12. dog->name = "Spike";
  13. dog->age = 3;
  14. }
http://rextester.com/UQDA99254

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

textual
Листинг программы
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. const char ty = 'p';
  5. const char name[] = "lion";
  6.  
  7. typedef struct animal
  8. {
  9.     char type;
  10.     const char *name;
  11. } animal_t;
  12.  
  13. int main()
  14. {
  15.     animal_t* struct_data;
  16.     char* raw_data;
  17.     void* raw_mem;
  18.    
  19.     raw_mem = malloc(sizeof(animal_t));
  20.     struct_data = raw_mem;
  21.     raw_data = raw_mem;
  22.    
  23.     *raw_data = ty;
  24.     raw_data += sizeof ty;
  25.     raw_data = name;
  26.    
  27.     printf("type: %c, name: %s\n", struct_data->type, struct_data->name);
  28.     free(raw_mem);
  29.     return 0;
  30. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы