Для начала вы не выделяли память для массива указателей на объекты типа Person.Таким образом, программа имеет неопределенное поведение, когда вы пытаетесь разыменовать людей-указателей (или arr внутри функции):
*(arr + next_free_place) = next_person;
Во-вторых, вам также необходимо освободить всю выделенную память для каждого объекта в массиве.
Учтите, что помещать определения переменных в заголовки - плохая идея.Это может привести к ошибке компоновщика, когда заголовок включен в несколько блоков перевода.Вы должны размещать в заголовке только объявления переменных без их определений с использованием спецификатора extern
.Определения должны быть помещены в модуль.
Вот ваша обновленная программа.
#include <stdio.h>
#include <stdlib.h>
#define HOW_MANY 7
char *names[HOW_MANY] =
{
"Simon", "Suzie", "Alfred", "Chip", "John", "Tim", "Harriet"
};
unsigned int ages[HOW_MANY]= { 22, 24, 106, 6, 18, 32, 24 };
typedef struct Person
{
const char *name;
unsigned int age;
} Person;
enum RETURN_CODES { Success, Full, NotEnoughMemory };
static int insert( Person **arr, const char *name, unsigned int age )
{
static size_t next_free_place = 0;
if ( next_free_place == HOW_MANY ) return Full;
/* put name and age into the next free place in the array parameter here */
arr[next_free_place] = malloc( sizeof( Person ) );
if ( arr[next_free_place] == NULL ) return NotEnoughMemory;
arr[next_free_place]->name = name;
arr[next_free_place]->age = age;
++next_free_place;
return Success;
}
int main(void)
{
Person **people = calloc( HOW_MANY, sizeof( Person * ) );
for ( int i = 0; i < HOW_MANY; i++ )
{
insert( people, names[i], ages[i] );
}
for ( int i = 0; i < HOW_MANY; i++ )
{
printf( "Name: %s, Age: %u\n", people[i]->name, people[i]->age );
}
for ( int i = 0; i < HOW_MANY; i++ ) free( people[i] );
free( people );
return 0;
}
Вывод программы:
Name: Simon, Age: 22
Name: Suzie, Age: 24
Name: Alfred, Age: 106
Name: Chip, Age: 6
Name: John, Age: 18
Name: Tim, Age: 32
Name: Harriet, Age: 24