Динамические структуры

// Programming 1. Sample at 2016-11-17-14-00.56
#include <stdio.h>
#include <stdlib.h>
 
struct Person {
  char name[100];
  int  age;
  struct Person *next;
};
 
struct Person *data = NULL;
 
void generate_data()
{
  data = (struct Person*)malloc(sizeof(struct Person));
  struct Person *ptr = data;
  printf("data = %p\n",data);
  for(int i=0; i<5; i++)
  {
    sprintf(ptr->name,"name-%d",i);
    ptr->age = 10+i;
    if( 4 != i )
    {
      ptr->next = (struct Person*)malloc(sizeof(*ptr));
      ptr = ptr->next;
    } else ptr->next = NULL;
  }
}
 
void print_data() {
  struct Person *ptr = data;
  while(ptr)
  {
    printf("    %s, age %d\n",ptr->name, ptr->age);
    ptr=ptr->next;
  }
}
 
int main(/*int c, char **v */)
{
  generate_data(); 
  print_data();
  return 0;
}

Вопросы по коду

Вопрос: Я не понимаю строку
 data = (struct Person*)malloc (sizeof(struct Person)); 

Что хранит переменная data?

Ответ

Перменная data объявлена и инициализирована так:

struct Person *data = NULL;

Это указатель, который может ссылаться (но не ссылается в начальный момент, так как ему присвоено занчение NULL) на структуры типа struct Person.

Вызов

malloc (sizeof(struct Person))

выделяет память размером со структуру struct Person и после приведения типа

(struct Person*)

присваивает адрес этого блока памяти указателю data.

После всего этого data указывает на область данных в памяти, размером с struct Person, выделенную с помощью malloc