We will learn how to store student struct with Dynamic memory.
Dynamic Memory Struct
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
int id;
char *name;
};
int main(void) {
struct Student *s = malloc(sizeof( struct Student));
if(!s){ // s == NULL
perror("allocation failed");
return 1;
}
scanf("%d", &s->id);
char temp[100];
scanf("%99s",temp);
(*s).name = malloc(strlen(temp) + 1);
if (!s->name){
perror("failed to allocate name");
free(s);
return 1;
}
strcpy(s->name, temp);
printf("\n%d\n", s->id);
printf("Name: %s\n", s->name);
free(s);
return 0;
}
Student array
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
int id;
char *name;
};
int main(void) {
struct Student *s = malloc(2 * sizeof(struct Student));
if (!s) {
perror("allocation failed");
return 1;
}
for (int i = 0; i < 2; i++) {
printf("Enter ID and name: ");
scanf("%d", &s[i].id);
char temp[100];
scanf("%99s", temp);
s[i].name = malloc(strlen(temp) + 1);
if (!s[i].name) {
perror("failed to allocate name");
// free any previously allocated names before exiting
for (int j = 0; j < i; j++) {
free(s[j].name);
}
free(s);
return 1;
}
strcpy(s[i].name, temp);
printf("\nID: %d\n", s[i].id);
printf("Name: %s\n", s[i].name);
}
// ✅ free all names after use
for (int i = 0; i < 2; i++) {
free(s[i].name);
}
free(s);
return 0;
}
Simplify with function
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
int id;
char *name;
};
void freeStudent(struct Student *s, int counter){
for(int i =0; i<counter; i++){
free(s[i].name);
}
free(s);
}
int main(void) {
int N = 2;
struct Student *s = malloc(N*sizeof( struct Student));
if(!s){ // s == NULL
perror("allocation failed");
return 1;
}
for (int i=0; i< N; i++) {
printf("Enter id:");
scanf("%d", &s[i].id);
char temp[100];
printf("Enter name: ");
scanf("%99s",temp);
s[i].name = malloc(strlen(temp) + 1);
if (!s[i].name){
perror("failed to allocate name");
freeStudent(s,i);
return 1;
}
strcpy(s[i].name, temp);
printf("\n%d\n", s[i].id);
printf("Name: %s\n\n", s[i].name);
}
freeStudent(s,N);
return 0;
}