指向C中已声明但未初始化的变量的指针

时间:2017-03-17 22:31:31

标签: c pointers initialization

我一直在使用来自Stanford CS Library的材料审核C中单链表的基础知识,我在这里找到了以下代码:

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

struct node* BuildWithDummyNode(){
    struct node dummy;
    struct node* tail = & dummy;    // this line got me confused
    int i;
    dummy.next = NULL;
    for (i=1;i<6;i++){
        Push(&(tail->next), i);    
        tail = tail->next;
    }
    return dummy.next;
}

可能不是rev​​enant,但Push()的代码是:

void Push(struct node** headRef, int data){
    struct node* NewNode = malloc(sizeof(struct node));
    newNode->data = data;

    newNode->next = *headRef;
    *headRef = newNode;
}

一切都顺利进行,但我总是认为无论何时定义指针,它都必须指向已定义的变量。但这里变量&#34; dummy&#34;仅声明且未初始化。不应该至少产生某种警告吗?

我知道默认情况下一些变量被初始化为0,并且在打印dummy.data之后它确实打印了0.所以这是一个&#34;可行但不好的练习&#34;的实例,或者我完全错过了什么?

非常感谢!

2 个答案:

答案 0 :(得分:2)

变量dummy已在以下声明中声明:

struct node dummy;

表示已为其分配内存。换句话说,这意味着它现在有一个与之关联的地址。因此,指针tail在以下行中声明:

struct node* tail = & dummy;

存储其地址非常有意义。

答案 1 :(得分:1)

&#34;但这里变量&#34; dummy&#34;仅声明且未初始化。&#34;

变量声明将其引入范围。你推断它是正确的,它的值是未指定的,但从它进入范围的那一刻起,它的地址就被明确定义,直到它超出范围。

更简单地说:你的程序是正确的,因为你不依赖于未初始化的变量值,而是依赖于明确定义的地址。