[英]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。 因此,似乎結構中定義的指針的默認值存在一些不一致。 當然,我可能做了一些完全錯誤的事情,但如果有人能夠闡明這件事,我將不勝感激。 為了解決所有問題,我的問題是:
因此,似乎結構中定義的指針的默認值存在一些不一致。
這正是問題 - 編譯器沒有將自動(本地)變量設置為任何默認值。 因此,您可能會得到一些導致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
的布局:)
還要注意,這可能不同於使用memset
將struct
memset
。 在某些體系結構中,全0位模式可能不是空指針或double
精度的正確初始化。 因此,最好堅持語言本身提供的初始化機制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.