如何使用双向链表正确初始化大结构?
How to properly initialize a big structure with doubly linked list?
我正在通过尝试制作一个简单的学校结构来练习链表,我边走边检查错误并注意到了这一点:
$ gcc list.c -Wall
list.c: In function ‘newStudent’:
list.c:52:15: warning: variable ‘newNode’ set but not used [-Wunused-but-set-variable]
studentList *newNode;
^~~~~~~
list.c: In function ‘initLists’:
list.c:36:14: warning: ‘auxSt’ is used uninitialized in this function [-Wuninitialized]
auxSt->name = NULL;
^
list.c:41:14: warning: ‘auxR’ is used uninitialized in this function [-Wuninitialized]
auxR->names = NULL;
^
list.c:46:16: warning: ‘school’ is used uninitialized in this function [-Wuninitialized]
school->rooms = NULL;
^
到目前为止,这是我的代码...
typedef struct roomList roomList;
typedef struct school school;
typedef struct studentList studentList;
struct studentList
{
char *name;
int grade;
studentList *next;
studentList *prev;
};
struct roomList
{
int class;
int nrOfStudents;
studentList *names;
roomList *next;
roomList *prev;
};
struct school
{
int totalStudents;
roomList *rooms;
};
void initLists()
{
studentList *auxSt;
auxSt->name = NULL;
auxSt->next = auxSt->prev = NULL;
auxSt = NULL;
roomList *auxR;
auxR->names = NULL;
auxR->next = auxR->prev = NULL;
auxR = NULL;
school *school;
school->rooms = NULL;
school = NULL;
}
int main()
{
initLists();
return 0;
}
但似乎在我先用 NULL
初始化我的 aux 变量之后,然后再转到成员,这个警告就消失了。但是我担心在其成员之前用 NULL 初始化 aux 变量。
我走在正确的道路上吗?
使用 init()
函数比在插入时进行初始化有什么优势?几乎没有看到网上有这个功能的例子。
我们来看第一个函数
studentList *newStudent(int class, char *name)
{
studentList *newNode;
newNode = (studentList*)malloc(sizeof(studentList));
return NULL;
}
你什么都没有 returning。好吧,你 return NULL 指针。整个函数相当于
studentList *newStudent(int class, char *name)
{
return NULL;
}
唯一的例外是您的代码会导致额外的内存泄漏。您需要将 return NULL
替换为 return newNode
。此外,永远不要强制转换 malloc 并使用 var 而不是 type 作为 sizeof 的 arg。只需使用 newNode = malloc(sizeof(*newNode))
函数initLists
也有类似的问题。您创建了几个变量,但在函数完成后并没有以重要的方式使用它们。您还尝试取消引用未分配的指针。
Am I on the right path for this?
不是真的。我建议多研究一下指针和内存分配,并搜索双向链表的示例代码。
studentList *auxSt; // auxSt is not initialized
auxSt->name = NULL; // here you dereference a non initialized pointer
你当然会在这里收到 ‘auxSt’ is used uninitialized in this function
警告,你期望什么?
现在我猜你试过这个:
studentList *auxSt = NULL; // auxSt is initialized to NULL
auxSt->name = NULL; // here you dereference an initialized pointer (no warning)
这里你不会收到 ‘auxSt’ is used uninitialized in this function
警告,因为这里 auxSt
是 初始化的。然而这段代码仍然是错误的,因为取消引用 NULL 指针不会有好的结果。
所以在全球范围内,您可能没有走在正确的道路上。
整个initLists
函数完全错误。
我正在通过尝试制作一个简单的学校结构来练习链表,我边走边检查错误并注意到了这一点:
$ gcc list.c -Wall
list.c: In function ‘newStudent’:
list.c:52:15: warning: variable ‘newNode’ set but not used [-Wunused-but-set-variable]
studentList *newNode;
^~~~~~~
list.c: In function ‘initLists’:
list.c:36:14: warning: ‘auxSt’ is used uninitialized in this function [-Wuninitialized]
auxSt->name = NULL;
^
list.c:41:14: warning: ‘auxR’ is used uninitialized in this function [-Wuninitialized]
auxR->names = NULL;
^
list.c:46:16: warning: ‘school’ is used uninitialized in this function [-Wuninitialized]
school->rooms = NULL;
^
到目前为止,这是我的代码...
typedef struct roomList roomList;
typedef struct school school;
typedef struct studentList studentList;
struct studentList
{
char *name;
int grade;
studentList *next;
studentList *prev;
};
struct roomList
{
int class;
int nrOfStudents;
studentList *names;
roomList *next;
roomList *prev;
};
struct school
{
int totalStudents;
roomList *rooms;
};
void initLists()
{
studentList *auxSt;
auxSt->name = NULL;
auxSt->next = auxSt->prev = NULL;
auxSt = NULL;
roomList *auxR;
auxR->names = NULL;
auxR->next = auxR->prev = NULL;
auxR = NULL;
school *school;
school->rooms = NULL;
school = NULL;
}
int main()
{
initLists();
return 0;
}
但似乎在我先用 NULL
初始化我的 aux 变量之后,然后再转到成员,这个警告就消失了。但是我担心在其成员之前用 NULL 初始化 aux 变量。
我走在正确的道路上吗?
使用 init()
函数比在插入时进行初始化有什么优势?几乎没有看到网上有这个功能的例子。
我们来看第一个函数
studentList *newStudent(int class, char *name)
{
studentList *newNode;
newNode = (studentList*)malloc(sizeof(studentList));
return NULL;
}
你什么都没有 returning。好吧,你 return NULL 指针。整个函数相当于
studentList *newStudent(int class, char *name)
{
return NULL;
}
唯一的例外是您的代码会导致额外的内存泄漏。您需要将 return NULL
替换为 return newNode
。此外,永远不要强制转换 malloc 并使用 var 而不是 type 作为 sizeof 的 arg。只需使用 newNode = malloc(sizeof(*newNode))
函数initLists
也有类似的问题。您创建了几个变量,但在函数完成后并没有以重要的方式使用它们。您还尝试取消引用未分配的指针。
Am I on the right path for this?
不是真的。我建议多研究一下指针和内存分配,并搜索双向链表的示例代码。
studentList *auxSt; // auxSt is not initialized
auxSt->name = NULL; // here you dereference a non initialized pointer
你当然会在这里收到 ‘auxSt’ is used uninitialized in this function
警告,你期望什么?
现在我猜你试过这个:
studentList *auxSt = NULL; // auxSt is initialized to NULL
auxSt->name = NULL; // here you dereference an initialized pointer (no warning)
这里你不会收到 ‘auxSt’ is used uninitialized in this function
警告,因为这里 auxSt
是 初始化的。然而这段代码仍然是错误的,因为取消引用 NULL 指针不会有好的结果。
所以在全球范围内,您可能没有走在正确的道路上。
整个initLists
函数完全错误。