簡體   English   中英

C - 結構中指針的默認值

[英]C - Default value for pointer within a struct

對於C中的單個鏈表,我有以下非常簡單的實現:

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


void printLL(node * start);
void addNode(node * head, node * add);

int main()
{
    node first;
    first.data = 99;
    first.next = NULL;

    node second;
    second.data = 11;

    addNode(&first, &second);   
    printLL(&first);    
}

void addNode(node * head, node * add)
{
    if(head->next)
    {
        addNode(head->next, add);
    }
    else 
    {
        head->next = add;
    }
}

void printLL(node * start)
{
    printf("Data is %d\n", start->data);
    if (start->next) {
        printLL(start->next);
    }
}

我很困惑的是,如果我沒有顯式設置first.next = NULL,我會收到一個EXE_BAD_ACCESS錯誤。 當我嘗試檢查是否設置了該屬性以確定是否應該遞歸調用時,會發生這種情況。 另一件我不明白的是,如果我將first.next設置為指向'second',那么即使對於'second',所有函數都可以正常工作。我沒有明確地將它設置為NULL。 因此,似乎結構中定義的指針的默認值存在一些不一致。 當然,我可能做了一些完全錯誤的事情,但如果有人能夠闡明這件事,我將不勝感激。 為了解決所有問題,我的問題是:

  1. 結構中定義的指針的默認值是什么?
  2. 假設沒有默認值,是否有一種簡單的方法可以在結構定義中設置默認值? (我瀏覽了一些C書,找不到這個問題的答案)

因此,似乎結構中定義的指針的默認值存在一些不一致。

這正是問題 - 編譯器沒有將自動(本地)變量設置為任何默認值。 因此,您可能會得到一些導致EXE_BAD_ACCESS ,或者您可能會得到一些似乎有效的內容。 這是抽獎的好運(即使看起來有效也是一個錯誤)。

C的一個缺點是您有責任確保正確初始化變量。 編譯器可以協助警告,並非所有編譯器在這方面都與其他編譯器一樣好。

有沒有一種簡單的方法在結構定義中設置默認值?

在結構的定義中沒有辦法做到這一點。 但是,您可以在聲明該類型的變量時初始化結構:

node first = { 99, NULL };

任何指針都沒有默認值,它包含垃圾值。 除非使用您自己的默認值初始化所有指針。

默認值可能取決於C編譯器,因此最好提供它們。

在創建結構實例(如second.next = NULL之后,必須先啟動它。

結構中的任何內容都沒有默認值(除非它是靜態創建的)。 並且沒有辦法提供一個 - 如果你想要那個,你應該使用C ++,它提供構造函數來做到這一點。 如果堅持使用C,則需要顯式初始化結構。

調用addNode(&first, &second); ,在if條件下,你正在做head->next是導致問題的原因。 next 默認情況 next未初始化並且在運行時導致EXE_BAD_ACCESS。

但是當你將它設置為NULL時if語句中的條件會失敗,並且會進入你實際分配指針的else語句。

如果需要默認指針值,可以創建一個工廠方法,該方法返回結構的新實例,並將值設置為所需的默認值。

沒有默認值。 除非明確修改,否則每個內存位置將保持其具有的任何值。 雖然此行為本身依賴於編譯器。 底線,你不能假設它將包含一個特定的值。

要設置默認值,最好在創建struct屬性時為struct屬性顯式賦值。

如果您使用的是C++ ,那么您將擁有構造函數,您可以/應該設置成員的默認值。

無論是否為struct ,自動變量都不會在C中初始化。 你必須自己初始化它們。

但與此處的大多數答案似乎暗示存在任何數據類型(包括指針)的初始化默認值相反。 這樣做就像任何組件將由普通值'0'顯式初始化一樣。 以你為榜樣

node first = { .data = 99 };

本來可以做到的。 然后保證next正確初始化。 (如果你沒有C99省略.data =並希望你永遠不會改變struct的布局:)

還要注意,這可能不同於使用memsetstruct memset 在某些體系結構中,全0位模式可能不是空指針或double精度的正確初始化。 因此,最好堅持語言本身提供的初始化機制。

暫無
暫無

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

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