簡體   English   中英

指向C中已聲明但未初始化的變量的指針

[英]Pointer to declared but uninitialized variable in C

我一直在審查C中單鏈表的基礎知識和來自斯坦福CS圖書館的資料 ,我在這里找到了以下代碼:

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;
}

一切都順利進行,但我總是認為無論何時定義指針,它都必須指向已定義的變量。 但是這里變量“dummy”只是聲明而不是初始化。 不應該至少產生某種警告嗎?

我知道一些變量默認初始化為0,並且在打印dummy.data之后它確實打印了0.所以這是“可行但不好的練習”的實例,還是我完全錯過了什么?

非常感謝你!

變量dummy已在以下語句中聲明:

struct node dummy;

這意味着已經為它分配了內存。 換句話說,這意味着它現在有一個與之關聯的地址。 因此指針tail在以下行中聲明:

struct node* tail = & dummy;

存儲它的地址非常有意義。

“但是這里變量”dummy“只是聲明而不是初始化。”

變量聲明將其引入范圍。 你是正確的推斷它的值是未指定的,但是從它進入范圍的那一刻開始,直到它超出范圍,從而獲取和使用它的地址是正確的。

更簡單地說:你的程序是正確的,因為你不依賴於未初始化的變量值,而是取決於它定義良好的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM