Это код C, который освобождает память от односвязного списка. Он скомпилирован с Visual C ++ 2008 и код работает так, как и должно быть.
/* Program done, so free allocated memory */
current = head;
struct film * temp;
temp = current;
while (current != NULL)
{
temp = current->next;
free(current);
current = temp;
}
Но я также столкнулся (даже в книгах) с тем же кодом, написанным так:
/* Program done, so free allocated memory */
current = head;
while (current != NULL)
{
free(current);
current = current->next;
}
Если я скомпилирую этот код с помощью моего VC ++ 2008, произойдет сбой программы, поскольку я сначала освобождаю текущий, а затем назначаю текущий -> рядом с текущим. Но, очевидно, если я скомпилирую этот код с другой компилятором (например, компилятором, который использовал автор книги), программа будет работать. Итак, вопрос в том, почему этот код скомпилирован с конкретным компилятором? Это потому, что этот компилятор поместил инструкции в двоичный файл, которые помнят адрес current-> next, хотя я освободил current, а мой VC ++ - нет. Я просто хочу понять, как работают компиляторы.