0

So I have the following implementation of linked list:

#ifndef LINKED_LIST
#define LINKED_LIST

struct Student
{
	char* name;
	char* surrname;
	char* signin_number;
	char* grade;
	char* date;

	struct Student* next;
};

struct Student* begin = NULL;

void push_back(struct Student* student)
{
    struct Student* temp = NULL;

    if(begin == NULL)
    {
        begin = student;
        begin->next = NULL;
    }
    else
    {
        temp = begin;

        while( temp->next != NULL )
           temp = temp->next;

        student->next = NULL;
        temp->next = student;
    }
}

void clear()
{
    struct Student* temp = NULL;
    if (!begin) return;

    while(begin)
    {
        temp = begin->next;
        free(begin->name);
        free(begin->surrname);
        free(begin->signin_number);
        free(begin->date);
        free(begin->grade);
        free(begin);
        begin = temp;
    }
}

void print()
{
    struct Student* ptr = begin;

    while(ptr != NULL)
    {
        printf("%s\n", (*ptr).name);
		printf("%s\n", ptr->surrname);
		printf("%s\n", ptr->signin_number);
		printf("%s\n", ptr->date);
		printf("%s\n", ptr->grade);
        ptr = ptr->next;
    }
}

#endif

But the clear function does not work ... how should I free malloced memory?

Edited by bunnyboy: n/a

2
Contributors
3
Replies
4
Views
6 Years
Discussion Span
Last Post by bunnyboy
Featured Replies
  • 2
    Narue 5,707   6 Years Ago

    [B]>the error might be here ...[/B] It might. [B]>new_student->name = (char *)malloc(8 * sizeof(char));[/B] You allocate memory to name, all is well so far (barring minor nits). [B]>new_student->name = "Michael\0";[/B] Bzzt! You've now overwritten your [i]only[/i] reference to the memory just allocated. Not only is this a memory leak, if … Read More

0

I should also mention that I allocate members of structure like this ... the error might be here ...

struct Student* new_student;
        if((new_student = (struct Student*)malloc(sizeof(struct Student))) != NULL)
        {
            new_student->name = (char *)malloc(8 * sizeof(char));
			new_student->name = "Michael\0";
			new_student->surrname = (char *)malloc(8 * sizeof(char));
			new_student->surrname = "Douglas\0";
			new_student->signin_number = (char *)malloc(9 * sizeof(char));
			new_student->signin_number = "E1006951\0";
			new_student->grade = (char *)malloc(3 * sizeof(char));
			new_student->grade = "10\0";
			new_student->date = (char *)malloc(7 * sizeof(char));
			new_student->date = "262988\0";
            push_back(new_student);
        }
2

>the error might be here ...
It might.

>new_student->name = (char *)malloc(8 * sizeof(char));
You allocate memory to name, all is well so far (barring minor nits).

>new_student->name = "Michael\0";
Bzzt! You've now overwritten your only reference to the memory just allocated. Not only is this a memory leak, if you call free on a pointer that wasn't returned by malloc and friends, bad things happen. You probably want to use strcpy to copy the contents of that string literal into name.

It should go without saying that this bug is repeated several times and you should address each instance rather than just name. I used name as the example.

Edited by Narue: n/a

0

Thank you Narue for quick response! Program is working now :)

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.