Нет ничего противозаконного в том, как вы используете malloc, но это не список, а массив указателей.
Для использования списка вы не фиксируете размер заранее и имеете указатель на следующий элемент. Вы можете сделать это навязчивым, а не навязчивым.
Для навязчивого списка вы ставите struct student * next
в декларации студента.
Для неинтрузивного списка вы создаете другую структуру struct student_list_node, которая содержит экземпляр struct student и указатель struct student_list_node * next;
Это пример неинтрузивной версии:
struct student_list_node
{
struct student data;
struct student_list_node * next;
};
struct student_list_node * head;
struct student_list_node * tail;
struct student_list_node * addStudentToTail()
{
struct student_list_node * newnode = (struct student_list_node *)(malloc( sizeof(struct student_list_node ) );
/* check malloc did not fail or use a checking vesrion of malloc */
if( !tail )
{
head = tail = newnode;
}
else
{
tail->next = newnode;
tail = newnode;
}
return newnode; // which is also "tail"
}
int main()
{
struct student_list_node * node = addStudentToTail();
struct student * pstud = &node->data;
/* write to pstud student details */
}
Если вы действительно хотите использовать массив, вы можете сделать его массивом студентов, а не студентов *, в этом случае вы можете использовать calloc вместо malloc
struct student * array = (struct student *)calloc( 30, sizeof( student ) );
Тогда использование free(array)
будет правильным способом избавиться от него. У вас также есть возможность выделить больше, если вам это понадобится позже, с помощью realloc. (Будьте осторожны с этим: вы должны хранить копию своего исходного указателя, пока не узнаете, что realloc преуспевает).