添加到 C 中的自引用结构列表?

Posted

技术标签:

【中文标题】添加到 C 中的自引用结构列表?【英文标题】:Adding to a list of Self Referential Structures in C? 【发布时间】:2022-01-07 13:31:13 【问题描述】:

我在尝试创建结构的自引用列表时遇到了许多问题。我目前正在收到一条非法的硬件指令,我所知道的是,它是在我的打印语句之后的打印语句之后的东西。谁能帮助指出我需要做些什么才能使我的实施正确?谢谢。

我的添加功能

Employee *employeeListHead = NULL;;

int nodeCount = 0;

void addEmployee(void)


    char *name = (char*) malloc(MAX_NAME_LENGTH*sizeof(char));
    char gender;
    int age;
    char *title = (char*) malloc(MAX_JOB_LENGTH*sizeof(char));;

    printf("Enter name: \n");   
    scanf(" %100s", name); 
    scanf("%*[^\n]%*c");

    printf("Enter gender: \n");
    scanf(" %1c", &gender); 
    scanf("%*[^\n]%*c");

    printf("Enter age: \n");
    scanf(" %d", &age); 
    scanf("%*[^\n]%*c");

    printf("Enter job title: \n");
    scanf(" %100s", title); 
    scanf("%*[^\n]%*c");
    
    printf("The employee you've entered is: %s %c %d %s \n", name, gender, age, title);

    Employee *newEmp = (Employee*)malloc(sizeof(Employee));
    
    strcpy(newEmp->name, name);
    strcpy(newEmp->gender, &gender);
    newEmp->age = age;
    strcpy(newEmp->profession, title);
    newEmp->next = NULL;

    if(employeeListHead == NULL)
    
        employeeListHead = newEmp;
        nodeCount++;
    
    else
       
        Employee *temp = (Employee*)malloc(sizeof(Employee));
        temp = employeeListHead;

        while(temp->next != NULL)
            temp = temp->next;
        
        temp->next = newEmp;
        nodeCount++;
        free(temp);
    
        

结构

typedef struct Employee
    char name[MAX_NAME_LENGTH];
    char gender[2];
    int age;
    char profession[MAX_JOB_LENGTH];
    struct Employee *next; 
 Employee;

【问题讨论】:

您能在 Employee 结构中添加吗? 欢迎来到 Stack Overflow。请使用tour 并阅读How to Ask。具体来说。寻求调试帮助的问题必须提供完整的minimal reproducible example。也就是说,任何人都可以完全按照所示重现问题的最少完整代码量。 strcpy(newEmp->gender, &gender); 是错误的,因为gender 是单个字符而不是字符串。执行newEmp->gender = gender,假设gender 字段是char(您没有显示)。 好的,既然您已经添加了struct 定义,我们可以说正确的代码是newEmp->gender[0] = gender; newEmp->gender[1] = '\0'; 或者将gender 作为字符串而不是单个字符读取,然后您可以使用strcpy。或者更好的是,直接读入 newEmp 字段 - 没有意义读入 tmp 变量然后复制。 Employee *temp = (Employee*)malloc(sizeof(Employee)); temp = employeeListHead; 是内存泄漏。然后你 free(temp); 但这是列表中的倒数第二个节点,因为循环。只需执行Employee *temp = employeeListHead; 并消除mallocfree 【参考方案1】:
char *name = (char*) malloc(MAX_NAME_LENGTH*sizeof(char));

你不需要这个(这是内存泄漏)。请改用char name[MAX_NAME_LENGTH];

char *title = (char*) malloc(MAX_JOB_LENGTH*sizeof(char));;

你不需要这个(这是内存泄漏)。请改用char title[MAX_JOB_LENGTH];

strcpy(newEmp->gender, &gender);

这是错误的。 gender 不是字符串(除非它是零长度字符串,这没有多大意义)。你不能strcpy 不是字符串的东西。 OTOH newEmp->gender 是一个字符串。要么制作这两个字符串,然后使用strcpy,要么制作两个单个字符,然后使用简单的赋值。

    Employee *temp = (Employee*)malloc(sizeof(Employee));
    temp = employeeListHead;

请不要这样做。你可能不会做这样的事情

    double x = 2.0 + 76*n + cos(y*2*pi*length);
    x = 42;

原因很明显:第一行的计算只是被第二行的赋值遗忘并丢弃了。你一开始就不可能写第一行,因为它没有做任何有用的事情。除非x 是一个指针并且第一行调用malloc,否则它不仅没有做任何有用的事情,而且还会做一些有害的事情:它会泄漏内存。

    Employee *temp = employeeListHead;

你只需要,当然最后没有free

【讨论】:

以上是关于添加到 C 中的自引用结构列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历 Thymeleaf 中的自引用实体列表?

c#如何将结构的引用添加到数组或列表?

无法将 IDFA 列表添加到 iAd Workbench 中的自定义细分 - 我的受众

MySQL中的自引用表字段

如何删除android中的自定义列表视图项?

如何从 Hadoop 中的地图程序中输出具有列表等数据结构的自定义类