4 of 5
added 2 characters in body
user avatar
user avatar

Dynamic array of structs in C

Based on some code on internet, I implemented a dynamic array of structures in C.

I am really interested in some feedback on this. Maybe there are some places where it can cause memory leaks or other pitfalls? (I am also concerned if there can be situation that I free a pointer twice in my case, and how to avoid that)

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    int ID;
    char * name;
} Student;

// array of structs
typedef struct
{
    Student *array;
    size_t used;
    size_t size;
} Array;

void initArray(Array *a, size_t initialSize)
{
    // Allocate initial space
    a->array = (Student *)malloc(initialSize * sizeof(Student));

    a->used = 0;           // no elements used
    a->size = initialSize; // available nr of elements

    // Initialize all values of the array to 0
    for(unsigned int i = 0; i<initialSize; i++)
    {
        memset(&a->array[i],0,sizeof(Student));
    }
}

// Add element to array
void insertArray(Array *a, Student element) 
{
    if (a->used == a->size)
    {
        a->size *= 2;
        a->array = (Student *)realloc(a->array, a->size * sizeof(Student));
    }

    // Copy name
    a->array[a->used].name = (char*)malloc(strlen(element.name) + 1);
    strcpy(a->array[a->used].name, element.name);

    // Copy ID
    a->array[a->used].ID=element.ID;

    a->used++;
}

void freeArray(Array *a) 
{
    // Free all name variables of each array element first
    for(int i=0; i<a->used; i++)
    {
        free(a->array[0].name);
        a->array[0].name=NULL;
    }

    // Now free the array 
    free(a->array);
    a->array = NULL;
    
    a->used = 0;
    a->size = 0;
}

int main(int argc, const char * argv[])
{

    Array a;
    Student x,y,z;
    
    x.ID = 20;
    x.name=(char*)malloc(strlen("stud1") + 1);
    strcpy(x.name,"stud1");
    
    y.ID = 30;
    y.name=(char*)malloc(strlen("student2") + 1);
    strcpy(y.name,"student2");
    
    z.ID = 40;
    z.name=(char*)malloc(strlen("student3") + 1);
    strcpy(z.name,"student3");
    
    // Init array
    initArray(&a, 5);   

    // Add elements 
    insertArray(&a, x);  
    insertArray(&a, y);   
    insertArray(&a, z);   

    // Print elements
    printf("%d\n", a.array[0].ID);        
    printf("%s\n", a.array[0].name);  
    printf("%d\n", a.array[1].ID);   
    printf("%s\n", a.array[1].name);   
    printf("%d\n", a.array[2].ID);   
    printf("%s\n", a.array[2].name);  
    printf("%d\n", a.array[3].ID);   
    printf("%s\n", a.array[3].name);   

    // Free array
    freeArray(&a);

    free(x.name);
    free(y.name);
    free(z.name);
    
    return 0;
}
user38434