繁体   English   中英

C:寻址链表中的内部结构

[英]C: addressing to inner structure in linked list

我有一个结构,它将成为一个链表。 但是起初我无法从内部结构读取值。 听起来很复杂,但这是代码:

#include <stdio.h>
#include <stdlib.h>

struct Address
{
    char city[50];
};

struct Task
{
    char fullName[255];
    struct Address address;
};

struct TaskList
{
    struct Task* task;
    struct TaskList* next;
};

struct Task createTask()
{
    struct Task task;
    struct Address address;
    printf("Enter full name: ");
    scanf("%s", task.fullName);
    printf("Enter the city: ");
    scanf("%s", address.city);
    task.address = address;

    return task;
}

void addTask(struct TaskList *head)
{
    struct TaskList* temp;
    struct Task task = createTask();
    temp->task = &task;
    temp->next = head;
    head = temp;
}

int main()
{
    struct TaskList *head;
    head = NULL;
    addTask(head);
    printf("%s", head->task->address.city);

    return 0;
}

当我启动应用程序并输入一些数据时,该过程因以下代码而崩溃:

进程返回的-1073741819(0xC0000005)执行时间:11.102 s

实际上,我该如何处理内部结构及其领域?

task所创造createTask是在堆栈中分配,它将功能之后被释放( createTask )结束。 请改用malloc

您应该通过Poiner将头指针传递给addTask()以在其中更改它:

struct TaskList* addTask(struct TaskList **head)

并在其中设置:

*head = temp;

并且createTask()必须探索malloc(),并且对于scanf()调用,必须使用指向变量的指针:

struct Task *createTask()
{
    struct Task *task = malloc(sizeof(struct Task));
    printf("Enter full name: ");
    scanf("%s", &task->fullName);
    printf("Enter the city: ");
    scanf("%s", &task->address.city);
    return task;
}

由于地址结构是Task的一部分-仅调用malloc()。

此代码有多个内存问题,这是其中一个的说明和解决方案。

Valgrind显示:

==1249== Invalid read of size 8
==1249==    at 0x40051B: main (/tmp/t.c:48)
==1249==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

它看起来像的head仍然是空当你打印在线路48 addTask不改变局部变量headmain 像这样修复它:

struct TaskList* addTask(struct TaskList *head)
{
    struct TaskList* temp = malloc(sizeof *temp);
    struct Task* task = malloc(sizeof *task);
    *task = createTask();
    temp->task = task;
    temp->next = head;
    return temp;
}
int main()
{
    struct TaskList *head;
    head = NULL;  
    head = addTask(head);
    printf("%s", head->task->address.city);
    return 0;
}
struct Address
{
    char city[50];
};

struct Task
{
    char fullName[255];
    Address address;
 };

struct TaskList
{
    Task* task;
    TaskList* next;
 };

 struct Task createTask()
 {
    Task task;
    Address address;
    printf("Enter full name: ");
    scanf("%s", task.fullName);
    printf("Enter the city: ");
    scanf("%s", address.city);
    task.address = address;

   return task;

}

另外,您的“ head”指针为空,请正确初始化

尝试以这种方式使用它,删除关键字“ struct”,它必须工作正常

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM