2013-10-10 49 views
6

我爲什麼要使用malloc時同樣的工作,可以通過不如下的malloc做..爲什麼使用malloc結構?

#include <stdio.h> 
#include <conio.h> 

struct node { 
    int data; 
    struct node *l; 
    struct node *r; 
}; 

int main(){ 
    //Case 1 
    struct node n1; 
    n1.data = 99; 
    printf("n1 data is %d\n", n1.data); 

    //Case 2 
    struct node *n2 = (struct node *) malloc (sizeof(struct node)); 
    n2 -> data = 4444; 
    printf("n2 data is:%d\n",n2 -> data); 
    free(n2); 

    return (0); 
} 
  1. 我有很難理解如何N1未初始化的內存位置是能夠存儲數據(99)。
  2. 時使用殼體1以及何時使用殼體2

回答

9

我爲什麼要使用malloc時同樣的工作,通過甘蔗沒有的malloc如下 做..

您使用malloc ,在堆上分配內存,如果沒有malloc,則會將struct放入堆棧內存中。

我很難理解未初始化的內存位置 如何能夠存儲數據(99)。

初始化與否,當您分配數據n1.data = 99;時,它被存儲。

2)時使用的殼體1,以及何時使用殼體2

情況1中使用的,當你知道你將使用限制範圍內的結構對象,並且不會在超出其範圍的情況下引用結構數據。

當您將在多個地方使用您的結構,並且您願意爲其手動管理內存(並小心!)時使用情況2。這種方法的優點是,在程序範圍的某個部分創建和初始化結構,並且創建一個指針並傳遞指針,因爲傳遞4個字節的指針比傳遞結構本身更有效率。

+0

你是我的大師!準確的答案,並清除我腦海中的每一個問題!希望我可以投票1000給你哈哈...感謝很多。 –

+1

'「4個字節的指針比」'不僅僅是 - 「有效得多 - 它可以在寄存器中傳遞,而不是在內存中複製。 –

2

在第一種情況中,存儲器被分配在棧上。當變量n1超出範圍時,內存被釋放。

在第二種情況下,內存分配在堆上。您必須明確釋放內存資源(正如您對free所做的那樣)。

經驗法則是,您可以使用堆棧分配的內存來存儲大小有限的本地臨時數據結構(堆棧只是計算機內存的一部分,每個平臺都不相同)。將堆用於要保留或較大的數據結構。

使用谷歌搜索stack and heap會給你更多的信息。

3
int main() { 
    struct node n1; 
    n1.data = 99 

此儲備堆棧上空間(在main的幀),相當於一個struct node的大小。這被稱爲本地,它只存在於main的範圍內。

struct node *n2 = (struct node *) malloc (sizeof(struct node)); 

這是關於的分配。無論您使用哪種功能上下文,都會存在此內存。這通常稱爲「動態分配」。

這些node結構是linked list的基礎,它可以隨意添加,移除或重新排序節點等。

參見:

1

通常情況下,您只使用malloc,如果您不知道應用程序運行之前需要的內存大小。

您的代碼是正確的,但不能動態分配內存。如果你想在node.date中保存一個測量值並且你不知道,你會捕獲多少個測量值?然後,你必須在每次採取的措施上獲得一些新的記憶。

如果您在運行時間之前(直接在代碼中)定義所有節點,則無法保存比您之前定義的更多度量。

在c中搜索鏈表,你會發現一些很好的例子。

0

您的數據類型看起來像樹中的一個節點。使用malloc爲樹節點分配的兩個主要的原因是

  1. 要分配節點的任意數目。一般情況下,樹節點的數量是一個運行時間值。由於這個原因,不可能爲這些節點聲明適當數量的局部變量,因爲所有局部變量都必須在編譯時聲明。同時,可以在運行時多次調用malloc,根據需要分配儘可能多的節點對象。

  2. 確保節點在本地對象的生存期結束時(即在塊的結尾)不會自動銷燬。通過malloc分配的對象將永遠生活,即直到您通過調用free明確銷燬它們。這樣的對象將超越塊邊界和功能邊界。本地對象沒有這樣的可能,因爲局部對象在塊的末尾被自動銷燬。

您的代碼示例不依賴於動態分配的任何好處,因爲它確實會創建一棵真正的樹。它只是聲明爲單節點。但是如果你試圖用運行時節點數來構建一棵完整的樹,你會立即意識到通過將節點聲明爲本地對象是不可能的。您將不得不使用malloc分配您的節點。

您的「未初始化到內存位置的n1如何能夠存儲數據」問題必須引起一些混淆。 struct node n1;是一個對象定義,這意味着它爲n1分配一個存儲位置。這正是對象定義的目的。