2012-10-08 73 views
1

的內存分配考慮下面的C代碼 -無法瞭解結構

typedef struct node 
{ 
    int data; 
}node; 

int main() 
{ 
    node *temp; 
    temp->data=100; 
    printf("%d",temp->data); 
    return 0; 
} 

它給Segmentation fault在含有temp->data=100;因爲(我認爲)線我還沒有爲它分配內存。所以,沒有什麼比如temp->data
但是,當我嘗試 -

int main() 
{ 
    node *temp,*n; 
    n=(node*)malloc(sizeof(node)); 
    n->data=100; 
    temp->data=n->data; 
    printf("%d",temp->data); 
    retrun 0; 
} 

它給適當的輸出100 我沒有分配內存,其中temp必點。但我仍然複製n->datatemp->data。怎麼樣 ??

+0

這兩個程序都是不正確的 - 它只是碰巧一個*顯示*工作,而另一個不工作。 –

+1

未定義的行爲。它也可能會像第一個一樣崩潰(並且可能會對一些編譯器產生影響)。 –

回答

2

臨時指針因爲未初始化而需要一些垃圾值偶然臨時有一個垃圾值,它可能是您的程序的合法地址,因此它會運行,如果垃圾值具有非法地址,則會生成段錯誤。

0

你的第一部分的權利,它段錯誤,因爲節點* temp沒有指向任何地方(以及某處,但不是分配的內存)。

我不知道爲什麼第二個「有效」。我懷疑它只是看起來工作,因爲它不會崩潰。但由於臨時工從未初始化,誰知道它堅持'100'的地方。也許只是在稍後休息。無論哪種方式,寫入單元化內存不是一個好主意; -0

1

很幸運。

局部變量不會自動初始化,所以當程序開始時,tempn都包含堆棧上發生的任何值。接下來,分配內存並將n設置爲指向它。值100存儲在該結構的data成員中。

temp仍未初始化,因此將值100複製到未指定的內存區域。根據內存發生的位置,程序可能會出現段錯誤,或者它可能會簡單地破壞它不擁有的內存。

1

您還沒有在temp->data=n->data;中發生段錯誤只是巧合。 temp未初始化,因此它指向數字涅。。

當你叫malloc你分配sizeof node字節(在現實中,它可能還要多一點),然後你有塊完整的內存訪問通過n指向。

一般來說,你應該叫malloc這樣:

node *n; 
n = malloc(sizeof *n); 
  1. 沒有投
  2. sizeof *n而不是sizeof <datatype>。如果你改變了數據類型(例如,你有一個錯字,而不是typedef .... node你已經寫了typedef ... nhode。那麼你只需要改變變量的聲明,其餘的代碼根本不需要改變。
1

你的第一個代碼也是正確的「臨時」指向一個垃圾值,所以你必須初始化它。

temp=(node *)malloc(sizeof(node));