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

时间:2019-06-13 15:09:37

标签: c data-structures initialization 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()函数比初始化有什么好处?几乎没有一个在线示例显示此功能。

2 个答案:

答案 0 :(得分:2)

让我们看一下第一个功能。

studentList *newStudent(int class, char *name)
{
    studentList *newNode;
    newNode = (studentList*)malloc(sizeof(studentList));

    return NULL;     
}

您什么都不会退货。好吧,您返回NULL指针。整个功能等效于

studentList *newStudent(int class, char *name)
{
    return NULL;     
}

,唯一的例外是您的代码会导致额外的内存泄漏。您需要将return NULL替换为return newNode。另外,切勿强制转换malloc并使用var而不是type作为arg的sizeof。只需使用newNode = malloc(sizeof(*newNode))

函数initLists有类似的问题。您创建了两个变量,但是在函数完成后,它们的使用方式并不重要。您还尝试取消引用未分配的指针。

  

我是否在正确的道路上?

不是。我建议多研究一下指针和内存分配,并搜索示例代码以获取双向链表。

答案 1 :(得分:0)

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