Структура malloc динамического выделения C

#c #syntax

#c #синтаксис

Вопрос:

Я просматриваю практические занятия для своего курса по операционным системам, и я не могу разобраться в этом примере. Я запустил программу, и она не работает.

 #include <stdio.h>

typedef struct {
int age;
float height;}Person;

void init(Person *);
int main() {

Person *Callum;
Callum = malloc(sizeof(*Callum));
init(Callum);
printf("Age: %d, height: %fn", Callum.age, Callum.height);}

void init(Person * individual)
printf("Age: "); scanf("%d", amp;(individual->age));
printf("Height: "); scanf("%f", amp;(individual->height));}
  

Я попытаюсь объяснить, что, по моему мнению, происходит, и если бы вы могли исправить мою логику, я был бы очень благодарен:

  • У нас есть указатель с именем Callum типа Person .
  • ‘Callum = malloc(sizeof(*Callum));’ => Означает ли это, что нашей переменной callum был выделен объем памяти нашей структуры в куче?
  • Человек указывает на нашу переменную Callum. Редактировать: Извините, я запутался, набрав его, я имел в виду, что individual указывает на нашу структуру Person.
  • Программа считывает входные данные и присваивает им адрес individual, который является местоположением нашей переменной Callum. Затем мы печатаем значения Callum.

Извините, это потрясает мой мозг. Я знаю основную механику структуры и указателя, но я просто не могу представить, что происходит. Любая помощь будет оценена. Спасибо.

Комментарии:

1. «Person указывает на …» — Person это тип , а не указатель, поэтому неверно.

2. для имен переменных следует использовать нижний регистр

3. Этот беспорядок нечитаем. Узнайте о наборе отступов, используйте indent перед публикацией.

Ответ №1:

Вам нужно сделать:

 printf("Age: %d, height: %fn", Callum->age, Callum->height);}
  

Ответ №2:

В вашем коде,

   void init(Callum * individual)
  

неверно. Вам нужно написать

   void init(Person * individual)
  

как Person и тип данных. Кроме того, функция должна быть заключена в фигурные скобки, такие же, как main() .

Кроме того, в вашем main() , в качестве Callum типа указателя is, вы должны использовать оператор разыменования элемента указателя ->

  printf("Age: %d, height: %fn", Callum->age, Callum->height);
  

Тем не менее, что касается вопросов

  • Callum = malloc(sizeof(*Callum)); => Означает ли это, что нашей переменной callum был выделен объем памяти нашего struct в нашей куче?
  • Да, до тех пор, пока malloc() это успех.
  • Человек указывает на нашу переменную Callum
  • На самом деле нет. Правильный способ выражения — Callum это переменная типа указатель на Person .

Комментарии:

1. Примечание: OP изменил вопрос, сделав ваш ответ (частично) недействительным. На этот раз я оставлю это вам для отката:-)