首页 文章

malloc和free动态变化的结构

提问于
浏览
0

我在动态变化的结构中移动指针时遇到了麻烦 . 我已经创建了我的代码,你可以在malloc中获得更多的内存,这似乎是有效的 . 我遇到的问题是如何添加到结构,如何释放内存以及如何从结构移动到结构并打印所有项目 .

我正在尝试测试添加和打印(删除功能似乎没有用,segfaults)

当我添加到结构然后打印结构时,我从我添加的值中得到一个段错误 . 我不知道我是否正确地从第一个结构转移到下一个结构 .

#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's 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));


}

2 回答

  • 0

    第一个问题:好的......您没有包含员工类型的声明 . 我猜第一个和最后一个被声明为char指针,这是一个错误 . 你需要它们是固定大小的char数组,否则这将无法工作 . 选择字符串的最大长度并声明结构如下 .

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

    上一篇文章:

    好吧,我必须承认我不喜欢这种方式来实现这个东西 . 我会使用更稳定的方法 .

    首先,由于它只是一个项目列表,您可以使用双向链表 . 这将允许您添加和删除具有O(1)复杂度的元素 . 确实很好 .

    这也允许您迭代从第一个到最后一个的所有项目 .

    为了做到这一点,我会使用更多面向OOP的方法:)我知道,我们在C但是听听这个想法 .

    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);
    }
    

    现在,迭代所有项目很简单:

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

    您没有使用malloc来分配employee的first,last和start_date属性 . 因此,当你在deleteData中的指针上调用free时,就会破坏内存 . 我还会考虑使用链表或其他数据结构(如数组)来保存员工记录,从而使您拥有更清晰的界面 .

相关问题