Explain the dynamic memory allocation of pointer to structure in C language

Pointer to structure holds the add of the entire structure.
It is used to create complex data structures such as linked lists, trees, graphs and so on.
The members of the structure can be accessed using a special operator called as an arrow operator ( -> ).
Following is the declaration for pointers to structures in C programming −
struct tagname *ptr;
For example: struct student *s;
It is explained below how to access the pointers to structures.
Ptr-> membername;
For example − s->sno, s->sname, s->marks;
Following is a C program that explains the dynamic memory allocation of structure in C programming −
 Live Demo
#include <stdio.h>
#include <stdlib.h>
struct person {
   int age;
   float weight;
   char name[30];
};
int main(){
   struct person *ptr;
   int i, n;
   printf("Enter the number of persons: ");
   scanf("%d", &n);
   // allocating memory for n numbers of struct person
   ptr = (struct person*) malloc(n * sizeof(struct person));
   for(i = 0; i < n; ++i){
      printf("Enter name and age respectively: ");
      // To access members of 1st struct person,
      // ptr->name and ptr->age is used
      // To access members of 2nd struct person,
      // (ptr+1)->name and (ptr+1)->age is used
      scanf("%s %d", (ptr+i)->name, &(ptr+i)->age);
   }
   printf("Displaying Information:\n");
   for(i = 0; i < n; ++i)
      printf("Name: %s\tAge: %d\n", (ptr+i)->name, (ptr+i)->age);
   return 0;
}
When the above program is executed, it produces the following result −
Enter the number of persons: 1
Enter name and age respectively: bhanu 24
Displaying Information:
Name: bhanu Age: 24
Consider another example on pointers and structures, wherein, a C program to demonstrate pointers and structures is given.
 Live Demo
#include<stdio.h>
//Declaring outer and inter structures//
struct Manager{
   char Name[15];
   int Age;
   char Gender;
   float Level;
   char Role[50];
   char temp;
}m[20];
void main(){
   //Declaring variable for For loop and pointer variable//
   int i;
   struct Manager *p;
   //Defining Pointer//
   p=&m;
   //Reading User I/p//
   for (i=1;i<3;i++){//Declaring function to accept 2 manager's data//
      printf("Enter the Name of manager %d : ",i);
      gets(p->Name);
      printf("Enter the Age of manager %d : ",i);
      scanf("%d",&p->Age);
      scanf("%c",&p->temp);//Clearing Buffer//
      printf("Enter the Gender of manager %d : ",i);
      scanf("%c",&p->Gender);
      //scanf("%c",&p->temp);//Clearing Buffer//
      printf("Enter the level of manager %d : ",i);
      scanf("%f",&p->Level);
      scanf("%c",&p->temp);//Clearing Buffer//
      printf("Enter the role of manager %d : ",i);
      gets(p->Role);
      p++;
   }
   //Defining Pointer one more time to print output//
   p=&m;
   //Printing O/p//
   for (i=1;i<3;i++){
      printf("The Name of Manager %d is : %s\n",i,p->Name);
      printf("The Age of Manager %d is : %d\n",i,p->Age);
      printf("The Gender of Manager %d is : %c\n",i,p->Gender);
      printf("The Level of Manager %d is : %f\n",i,p->Level);
      printf("The Role of Manager %d is : %s\n",i,p->Role);
      p++;
   }
}
When the above program is executed, it produces the following result −
Enter the Name of manager 1 : Hari
Enter the Age of manager 1 : 55
Enter the Gender of manager 1 : M
Enter the level of manager 1 : 2
Enter the role of manager 1 : Senior
Enter the Name of manager 2 : Bob
Enter the Age of manager 2 : 60
Enter the Gender of manager 2 : M
Enter the level of manager 2 : 1
Enter the role of manager 2 : CEO
The Name of Manager 1 is : Hari
The Age of Manager 1 is : 55
The Gender of Manager 1 is : M
The Level of Manager 1 is : 2.000000
The Role of Manager 1 is : Senior
The Name of Manager 2 is : Bob
The Age of Manager 2 is : 60
The Gender of Manager 2 is : M
The Level of Manager 2 is : 1.000000
The Role of Manager 2 is : CEO