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;
}
Author by
Yiannis
Updated on June 04, 2022Comments
-
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; }