प्रता द्वारा सी प्राइमर प्लस पुस्तक का अध्ययन, 6 वां संस्करण, मैं लिस्टिंग 17.2 के लिंक्ड सूची उदाहरण में आया, जिसे इस पाठ के नीचे कॉपी किया गया है। मैं उस हिस्से के बारे में उलझन में हूं जहां वह फिर से स्मृति को मुक्त करता है। क्या वह अपने उदाहरण में सूचक को अगली सूची में मुक्त नहीं कर रहा है? अंत में, वह वर्तमान को सिर पर सेट करता है, जो वर्तमान बिंदु को पहली संरचना के प्रारंभिक स्मृति पते पर बनाता है। फिर वह करंट को मुक्त करता है और करंट = करंट-> नेक्स्ट सेट करता है, लेकिन करंट-> नेक्स्ट में अब कोई एड्रेस नहीं होना चाहिए क्योंकि करंट फ्री हो जाता है? कोडब्लॉक के माध्यम से प्रोग्राम चलाना ठीक काम करता है, लेकिन कोडब्लॉक्स में लूप के दौरान फ्री() को डिबग करना, मुझे सेगमेंट गलती मिलती है। मेरा मानना ​​है कि मेरी समझ सही है कि कार्यक्रम दोषपूर्ण है, है ना? धन्यवाद।

/* 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 */
};
char * s_gets(char * st, int n);
int main(void)
{
    struct film * head = NULL;
    struct film * prev, * current;
    char input[TSIZE];
    /* Gather and store information */
    puts("Enter first movie title:");
    while (s_gets(input, TSIZE) != 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;
}
char * s_gets(char * st, int n)
{
    char * ret_val;
    char * find;
    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n'); // look for newline
        if (find) // if the address is not NULL,
            *find = '\0'; // place a null character there
        else
            while (getchar() != '\n')
                continue; // dispose of rest of line
    }
    return ret_val;
}

1
Alex 16 अप्रैल 2020, 15:34

1 उत्तर

सबसे बढ़िया उत्तर
current = head;
while (current != NULL)
{
    free(current);
    current = current->next;
}

लेकिन करंट-> नेक्स्ट में अब कोई एड्रेस नहीं होना चाहिए क्योंकि करंट फ्री हो गया है?

आपकी धारणाएं सही हैं, आप पहले से हटाए गए नोड तक पहुंचने का प्रयास कर रहे हैं और यही कारण है कि आपका कोड segfaults, इसके बजाय, एक अस्थायी नोड का उपयोग करता है, इस मामले में आप head का पुन: उपयोग कर सकते हैं:

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

कोडब्लॉक के माध्यम से प्रोग्राम चलाना ठीक काम करता है ...

सम्पूर्ण भाग्य ...

1
David Ranieri 16 अप्रैल 2020, 12:42