свободное распределение памяти после malloc - PullRequest
0 голосов
/ 24 августа 2018

Я читал «c primer plus» Стивена Прата. Существует пример программы для связанного списка. Программа использует malloc для выделения пространства памяти для структурного массива, код для примера программы приведен ниже.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TSIZE 45

struct film{
 char title[TSIZE];
 int rating;
 struct film * next;
 };
char * s_gets(char * st,int n);

int main(void)
{
  struct film * head =NULL;
  struct film * prev, * current;
  char input[TSIZE];

puts("Enter first movie title:");
while(s_gets(input,TSIZE)!=NULL && input[0]!='\0')
{
    current=(struct film *)malloc(sizeof(struct film));
    if(head==NULL)
        head=current;
    else
        prev->next=current;
    current->next=NULL;
    strcpy(current->title,input);
    puts("Enter your rating <0-10>:");
    scanf("%d",&current->rating);
    while(getchar()!='\n')
        continue;
    puts("Enter next movie title (empty line to stop):");
    prev=current;
}
if(head==NULL)
    printf("No data entered.\n");
else
    printf("Here is the movie list:\n");
current=head;
while(current!=NULL)
{
    printf("Movie: %s Rating: %d\n",current->title,current->rating);

    current=current->next;
}
current=head;
while(current!=NULL)
{
    free(current);
    current=current->next;
}
printf("Bye!\n");

return 0;
}

char * s_gets(char * st,int n)
{
char * ret_val;
char * find;
if((ret_val=fgets(st,n,stdin)))
{
    if((find=strchr(st,'\n'))!=NULL)
    *find='\0';
    else
        while(getchar()!='\n')
        continue;
}
return ret_val;
}

Мое замешательство из-за свободного кода. Ток освобождается free(current); почему следующая строка может получить эффект? current=current->next; так как current освобождается, эта строка не должна иметь никакого доступа к текущему члену "next".

С нетерпением ждем вашей помощи в этом.

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

The свободный (ток); не очищает память, которая находится в точке @ текущего, просто возвращает ее в пул памяти, чтобы ее можно было повторно использовать, очистка памяти не производится, поэтому она будет продолжать содержать те же данные лучше было бы добавить ток = NULL; сразу после

0 голосов
/ 24 августа 2018

Когда вы делаете это

while(current!=NULL)
{
    free(current);
    current=current->next;
}

Вы делаете current указатель повисшим и пытаетесь получить к нему доступ current=current->next;, что приведет к неопределенному поведению.

Я бы предложил вам бесплатно, как показано ниже. Кроме того, ваш указатель current будет указывать на NULL, поскольку вы зациклились до конца списка перед свободным циклом while.

current=head;
while(current!=NULL)
{
    struct film * temp = current;
    current=current->next;
    free(temp);
}
...