[ dontoo @ 21.03.2010. 17:45 ] @
Da sad ne zamaram sa cijelim kodom, evo u čemu je problem. U knjizi C Primer plus autor pravi vezanu listu koja ruši program kod čišćenja memorije. Inače list iz knige radi ( napravi se uredno ).

Primjer iz knjige:
Code:

current = head;

while (current != NULL)

{

    free(current);                    //Autor prvo uništi objekt...

    current = current->next;     //Pa taj uništeni objekt pridružuje pointer varijabli current ( tu program puca )

}


Moj prepravak:
Code:
    current = head;
    while (current != NULL)
    {
        head = current->next;                //spreman pokazivač na sljedeći član u varijabu head
        free(current);                           //uništavam objekt
        current = head;                        //sad imam što pridružiti varijabli current koju ću uništiti u sljedećem krugu
    }
    printf("Bye!\n");


Samo me zanima jeli ovo ok što sam napravio da nebi naučio krivo?
[ dontoo @ 21.03.2010. 17:55 ] @
Downloadao sam source code knjige i u njemu ista greška. Pa dali ti ljudi kompajiraju svoje programe, ili im njihov kompjler ne prijavi grešku?
Code:
/* films2.c -- using a linked list of structures */
#include <stdio.h>
#include <stdlib.h>      /* has the malloc prototype      */
#include <string.h>      /* has the strcpy prototype      */
#define TSIZE    45      /* size of array to hold title   */

struct film {
    char title[TSIZE];
    int rating;
    struct film * next;  /* points to next struct in list */
};

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

/* Gather  and store information          */
    puts("Enter first movie title:");
    while (gets(input) != NULL && input[0] != '\0')
    {
        current = (struct film *) malloc(sizeof(struct film));
        if (head == NULL)       /* first structure       */
            head = current;
        else                    /* subsequent structures */
            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;
    }

/* Show list of movies                    */
    if (head == NULL)
        printf("No data entered. ");
    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;
    }

/* Program done, so free allocated memory */
    current = head;
    while (current != NULL)
    {
        free(current);
        current = current->next;
    }
    printf("Bye!\n");

    return 0;
}
[ X Files @ 21.03.2010. 18:17 ] @
Nisi jedini koji je to primetio:

Da ne prepricavam, evo detalja:
http://bytes.com/topic/c/answe...665-freeing-simple-linked-list
[ dontoo @ 21.03.2010. 20:18 ] @
Samo da još nešto pitam. Trebam li deklarirati još jednu temp pointer varijablu ili mogu koristit head kao temp varijablu?
Code:

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

Ovaj kod ne deklarira novu varijablu već korist head za temp varijablu:
Code:
    current = head;
    while (current != NULL)
    {
        head = current->next;
        free(current);
        current = head;
    }

Što me brine? Ja mislim (tako mi se čini logično) da u drugom primjeru mogu koristiti head kao temp jer:
current = head; //current pokazuje na memorijsku lokaciju na koju pokazuje head
head = current->next; // head pokazuje na novu memorijsku lokaciju, ali current i dalje pokazuje na lokaciju na koju je prije pokazivo head
//To me brine, dali mjenjanjem lokacije na koju pokazuje head i current nekako pokazuje na tu lokaciju ( zbog current = head )?
free( current );
current = head; //current pokazuje na novu lokaciju heada
[ Mihajlo Cvetanović @ 21.03.2010. 20:31 ] @
Recikliranjem promenljivih činiš sebi medveđu uslugu. Ne dobijaš apsolutno ništa, a gubiš na razumljivosti koda. Kad god pišeš kod prve stvari na umu moraju da ti budu funkcionalnost, elegancija i čitljivost koda, mogućnost lake reorganizacije, pa tek onda vremenska i prostorna optimizacija. Gledaj na to ovako: ako recikliraš promenljivu uštedeo si 4 bajta sad, ali onaj ko bude gledao kod potrošiće 4 minuta više da shvati šta se tu dešava. Ti sam odluči šta je tu vrednije.