How to correctly allocate memory for an array of structs in C?

13,512

You are trying to allocate a array with the size of the pointer to the date struct instead of the actual size of the date struct.

Change date* to date:

array = malloc(size*sizeof(date));

Furthermore you don't need to allocate the day and year variables, because the malloc allocates them for you.

for (i=0; i<size; i++)
{
     array[i].month = calloc(MAX_MONTH_STR,sizeof(char));
     array[i].day = 0;
     array[i].year = 0;
}
Share:
13,512
Yiannis
Author by

Yiannis

Updated on June 04, 2022

Comments

  • Yiannis
    Yiannis almost 2 years

    This is the first time I'm using structs as I am still relatively new to C. When I try to input values for 3 structs the program crashes, but it works fine for 1 and 2. I think I may not actually be allocating enough memory. Is this the correct way to allocate memory for an array of structs?

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MIN_SIZE 0
    #define MAX_SIZE 100
    #define MAX_MONTH_STR 9
    
    //Define a struct data type
    typedef struct
    {
        char* month;
        int day;
        int year;
    }date;
    
    //Method to allocate memory for a list of date structures
    date* allocateStruct(int size)
    {
        //Declaration of variables
        date *array;
        int i;
    
        //Allocate memory for rows (to store 'size' many pointers to 'date' struct data type)
        array = malloc(size*sizeof(date*));
    
        //For-loop to allocate memory for columns (to store 'size' many integers, and initialize them to zero)
        for (i=0; i<size; i++)
        {
            array[i].month = calloc(MAX_MONTH_STR,sizeof(char));
            array[i].day = calloc(1,sizeof(int));
            array[i].year = calloc(1,sizeof(int));
        }
    
        return array;
    }
    
    //Method to free memory allocated
    //TO DO. . .
    
    int main()
    {
        //Declaration of variables
        int n;
        date* date_list;
        int i, j, k; //used in loops
    
        //Read input
        do
        {
            //printf("Enter number of dates you want to enter (between 1 and 10000):\n");
            scanf("%d", &n);
        }while(n<MIN_SIZE || n>MAX_SIZE);
    
        //ALLOCATE MEMORY
        date_list = allocateStruct(n);
    
    
        //For-loop to store values in 'date_list'
        for (i=0; i<n; i++)
        {
            //printf("Enter the date (month day year) in the following format: text number number");
            scanf("%s", date_list[i].month);
            scanf("%d", &date_list[i].day);
            scanf("%d", &date_list[i].year); //need & ?
        }
    
    //--------> crashes here if 3 dates are input, ok for 1 and 2
    
        //Test print
        for (i=0; i<n; i++)
        {
            //printf("Enter the date (month day year) in the following format: text number number");
            printf("%s ", date_list[i].month);
            printf("%d ", date_list[i].day);
            printf("%d\n", date_list[i].year); //need & ?
        }
    
        return 0;
    }