如何使用双向链表正确初始化大结构?

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函数完全错误。