本地与全球声明

declaration in local vs global

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int data;
    struct node* link;
};

void insert_last(struct node **head, int value)
{
    struct node* new = malloc(sizeof(struct node));
    new->data = value;

    if( !*head )
    {
        new->link = NULL;
        *head = new;
    }
    else
    {
        struct node* last = *head;
        while(last->link)
        {
            last = last->link;
        }
        new->link = NULL;
        last->link = new;
    }
}

    struct node *head;

int main()
{
    insert_last( & head,  5);
    insert_last( & head, 10);
    insert_last( & head, 15);
    printf("%d  ", head->data);
    printf("%d  ", head->link->data);
    printf("%d  ", head->link->link->data);

}
如果我在 main 中声明 struct node *head 则程序无法正常工作。 是什么原因 ? > 如果我在全球范围内声明其工作,否则不工作。 > 我重复这个问题是因为 Whosebug 要求添加更多详细信息(> 如果我在 main 的一侧声明 struct node *head 则程序无法正常工作。 是什么原因 ? > 如果我在全球范围内声明其工作,否则不工作。)

有一个初始化错误:在 insert_last() 中,变量 head 在没有被显式初始化的情况下被测试。如果 head 被声明为全局的,它位于一个全局部分中,该部分很可能被加载程序初始化为 0(当程序启动时);如果 head 在函数 main() 中声明,那么它位于函数的堆栈中并且不设置为 0.