今天在学习《C primer plus》的第17章过程中,出现了一个段错误的问题。
经过检查,是struct film * head
没有初始化为NULL的原因,这导致第一次创建链表节点时不会进入if (head == NULL)
分支。没有初始化的野指针会导致难以预料的结果。
如果将struct film * head
放到main函数外,作为全局变量的话则不会有这个问题,因为全局变量会自动初始化为0。
不过初始化是个好习惯啊,如果不是极端在意性能(初始化会有写内存的操作),建议都尽量初始化。
struct film {
char title[TSIZE];
int rating;
struct film * next; /* points to next struct in list */
};
char * s_gets(char * st, int n);
int main(void)
{
//此处必须初始化
struct film * head = NULL;
struct film * prev, * current;
char input[TSIZE];
/* Gather and store information */
puts("Enter first movie title:");
while (s_gets(input, TSIZE) != NULL && input[0] != '\0')
{
current = (struct film *) malloc(sizeof(struct film));
if (head == NULL) /* first structure */
head = current;
else /* subsequent structures */
prev->next = current;
//以下省略