Можно ли постоянно малло c без свободной памяти?
По идее да. На практике только до тех пор, пока у вас не закончится память.
сначала я выделяю память на new_node
.
И я не освободил ее и снова выделил память.
тогда, что происходит с первой памятью (Аватар)?
Это удалено? или где-то сохранено ..?
В вашем конкретном примере: если head == NULL
, оно (очевидно) сохранено. Здесь «это» относится к указателю на эту память.
Если бы head
не было NULL
(что невозможно в этом месте), у вас была бы утечка памяти: вы выделили память, которая вы больше не можете ссылаться.
Как правило, после malloc()
вы можете хранить эту память столько, сколько вам нужно. Это включает в себя сохранение его до конца вашей программы. Но если вы не сохраните указатель на эту память, вы ничего не сможете с ним сделать: ни использовать, ни освобождать его. В этом случае вашей программе требуется больше памяти, чем нужно, и если это происходит регулярно, это в конечном итоге приведет к ненужному засорению вашей памяти.
Однако в вашем случае вы сохраняете это new_node
в head
, так что это не потеряно. После этого вы можете использовать new_node
(это просто переменная для удержания указателя!) Для других целей.
Я бы предложил перенести выделение нового узла в отдельную функцию:
p_movie alloc_movie(char * name, float score)
{
p_movie new_node = malloc(sizeof(struct movie));
if (new_node == NULL) {
return NULL; // let the caller handle that
}
strcpy(new_node->movie_name, name);
new_node->score = score;
new_node->next = NULL;
return new_node;
}
и используйте это с
int main()
{
p_movie head = NULL;
p_movie new_node = alloc_movie("Avatar", 9.5f);
if (new_node == NULL)
{
exit(1);
}
// if (head == NULL) is unnecessary, as we can be sure it is null
head = new_node;
print_all(head);
new_node = alloc_movie("Aladdin", 8.0f);
if (new_node == NULL)
{
exit(1);
}
// Put the new node as the head, let the old head then be the next item.
p_movie temp = head;
head = new_node;
new_node->next = temp;
print_all(head);
}
или даже короче:
p_movie alloc_movie(char * name, float score, p_movie next)
{
p_movie new_node = malloc(sizeof(struct movie));
if (new_node == NULL) {
return NULL; // let the caller handle that
}
strcpy(new_node->movie_name, name);
new_node->score = score;
new_node->next = next;
return new_node;
}
int main()
{
p_movie new_node = alloc_movie("Avatar", 9.5f, NULL);
if (new_node == NULL)
{
exit(1);
}
p_movie head = new_node;
print_all(head);
// Create a new node, with the old head as its "next".
new_node = alloc_movie("Aladdin", 8.0f, head);
if (new_node == NULL)
{
exit(1);
}
// Overwrite the head, as its old value is already saved in the "Aladdin" node.
head = new_node;
print_all(head);
}