[英]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
不改变局部变量head
的main
。 像这样修复它:
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.