我正在尝试通过建立简单的学校结构来练习链表,我一直在进行错误检查,并注意到这一点:
$ 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()
函数比初始化有什么好处?几乎没有一个在线示例显示此功能。
答案 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
函数是完全错误的。