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?
这是我第一次使用结构,因为我仍然是C的相对新手。当我尝试输入3个结构的值时,程序崩溃,但它适用于1和2.我想我可能实际上没有足够的分配记忆。这是为结构数组分配内存的正确方法吗?
#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;
}
1 个解决方案
#1
2
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));
array = malloc(size * sizeof(date));
Furthermore you don't need to allocate the day and year variables, because the malloc allocates them for you.
此外,您不需要分配日期和年份变量,因为malloc会为您分配它们。
for (i=0; i<size; i++)
{
array[i].month = calloc(MAX_MONTH_STR,sizeof(char));
array[i].day = 0;
array[i].year = 0;
}
#1
2
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));
array = malloc(size * sizeof(date));
Furthermore you don't need to allocate the day and year variables, because the malloc allocates them for you.
此外,您不需要分配日期和年份变量,因为malloc会为您分配它们。
for (i=0; i<size; i++)
{
array[i].month = calloc(MAX_MONTH_STR,sizeof(char));
array[i].day = 0;
array[i].year = 0;
}