Malloc and free with dynamically changing structure

I am having problems moving the pointer in a dynamically changing structure. I created my code where you can store more memory, and this seems to work. The problems that I am facing are how to add to the structure, how to free memory and how to move from structure to structure and print all the elements.

I am trying to check add and print (delete function that does not work there, segfaults)

When I add to the structure and then print the structure, I get segfault from the values ​​I added. I do not know if I am moving from the first structure to the next structure correctly.

#include <stdio.h> #include <stdlib.h> #include "pointer.h" /******************************************** Creates more memory for size (strut * rec+1) *********************************************/ employee *create(int record){ employee *new_employee = malloc(sizeof(employee) * (record+1)); return new_employee; } /******************************************** Copies the data from one structure to a new structure with size "structure" multipled by rec+1 ***********************************************/ employee *copy(employee *data, int record){ employee *new_employee = create(record); int i; for(i = 0; i<record;i++){ new_employee->first = data->first; new_employee->last = data->last; new_employee->start_date = data->start_date; new_employee->sal = data->sal; data++; } /******************** Needs to free the old struct *********************/ //deleteData(data, record); return new_employee; } /******************************************** Function prints everything in the struct *********************************************/ void printStruct(employee *data, int record){ int i; for(i = 0; i<record; i++){ printf("\nEntry: %d\n", i+1); printf("The employee name is %s %s\n", data->first, data->last); printf("The employee was hired on: %s\n", data->start_date); printf("The employee make $%f\n\n", data->sal); data++; } } /****************************************** Function frees the old data base *******************************************/ void deleteData(employee *data, int record){ int i; for(i = 0; i<record; i++){ free(data->first); free(data->last); free(data->start_date); data++; } free(data); } /****************************************** Adds an employee to the new structure *******************************************/ employee *add(employee *data,char *fname, char *lname, char *date, float salary, int record){ employee *employeeDB = create(record); employeeDB = copy(data, record); int i; employeeDB++; employeeDB->first = fname; employeeDB->last = lname; employeeDB->start_date = date; employeeDB->sal = salary; return employeeDB; } /************************** Starts of the main function ***************************/ int main(void){ //Keeps track of the number of records that are in the structure int rec = 0; //Keeps the number of accesses to the structure. Even with the one entry the structure has not been accessed. int acc = 0; //Holds the input information for the menu int input; //holds the information for inputing user first name char *fname; //holds the information for inputing user last name char *lname; //holds the information for for the startdate char *start; //holds the information for the salary; float sal; /********************************* This next section adds an employee to the record ************************************/ //This creates the first entry to the dynamic structure. employee *first_employee = create(rec); first_employee->first = "FIRST"; first_employee->last = "LAST"; first_employee->start_date = "June-20th-2006"; first_employee->sal = 55555.55; //increase the number of records rec = rec+1; employee *new_employeeDB = add(first_employee, "fname", "lname", "JUNE-20th-2010", 55555.55, rec); rec = rec + 1; printStruct(new_employeeDB, rec); printf("%d\n", (sizeof(employee)* rec)); } 
0
source share
2 answers

First problem: Good ... you didn’t specify an employee type ad. I assume the first and last are declared as char pointers, and this is a mistake. You need them to be a fixed char array size, or this will never work. Select the maximum length for the string and declare the structure as follows.

 typedef struct { char name[50]; char surname[50]; .... } employee; 

Previous Post:

Well, I have to admit that I don't like this way of implementing things. I would use a more stable approach.

First of all, since this is just a list of items, you can use a doubly linked list. This will allow you to add and remove elements with O (1) complexity. Very good indeed.

It will also allow you to iterate over all elements from first to last.

For this, I would use a more OOP-oriented approach. I know we are in C, but listen to this idea.

 typedef struct { MyList* OwnerList; Employee* Previous; Employee* Next; char name[50]; int age; } Employee; typedef struct { Employee* First; Employee* Last; int Count; } MyList; MyList* AllocList() { return calloc(sizeof(MyList), 1); } void DeleteList(MyList* list) { Employee* current; Employee* next; for (current = list->First; current != NULL; current = next) { next = current->Next; free(current); } free(list); } int GetCount(const MyList* list) { return list->Count; } Employee* AddAmployee(MyList* list) { Employee* result = calloc(sizeof(Employee), 1); Employee* last = list->Last; if (last != null) last->Next = result; else list->First = result; result->Previous = last; list->Last = result; ++list->Count; result->OwnerList = list; return result; } void RemoveEmployee(Employee* employee) { /* i leave removal for you as exercise :) look for doubly linked list */ free(employee); } 

Now for iteration, all elements are simple:

 Employee* current; for (current = list->First; current != null; current = current->Next) printf("%s %d\n", current->name, current->age); 
0
source

You do not use malloc to distribute employee first, last, and start_date attributes. Therefore, when you call pointers in deleteData for free, you corrupt memory. I would also think about using a linked list or some other data structure (like an array) to save employee entries instead, which will allow you to have a cleaner interface.

0
source

All Articles