2016-07-07 35 views
1

如果沒有意義,請隨意編輯標題。所以我一直在使用malloc一段時間沒有真正完全確定它的工作原理。如果我創建一個int指針並將其設置爲malloc(10*sizeof(int),我認爲它在內存中分配了一個int大小的10倍的塊,然後返回此分配的起始地址,但是沒有任何內容在該內存中實際初始化。我到目前爲止還好嗎?如果你malloc一個struct *它創建局部變量嗎?

現在說我這樣創建的鏈接列表節點結構:

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

,然後有一個創建鏈接列表功能:

Node* LLCreate(int data) { 
    Node *head = malloc(sizeof(Node)); 
    if (head != NULL) { 
     head->next = NULL; // don't get how malloc created `next` 
     head->data = data; // or `data` 
    } 
    return head; 
} 

什麼我不明白,並能」如果head只是內存中一個大小爲Node的空塊的起始位置,而不是實際變量,那麼它是如何具有nextdata的局部變量?

也許這是一個無意義的問題,因爲我對這裏發生的事情有一些基本的誤解,但是如果任何人明白我想問什麼,並且可以爲我解決這個問題,我會非常感激。

+1

'head'是指向*(即*的*地址)* malloc全部內存的內存的*指針。 –

+1

變量只是一個存儲區域(加上一個類型)。 「變成一個變量」沒有什麼不可思議的。 –

+0

所以malloc實際上在內存中創建了struct,它不僅僅爲它分配空間? – Austin

回答

2

它沒有像nextdata這樣的局部變量。

nextdata僅用於計算相對於node指向的地址。

當你做node->data那麼地址計算爲address pointed by node + (total bytes required by any metadata for malloc) + 0,因爲datanode結構的第一個成員。

當你這樣做node->next那麼地址計算爲address pointed by node + (total bytes required by any metadata for malloc) + sizeof(data),因爲next是後data成員自帶的node結構的第二個成員。

+0

感謝這正是我需要閱讀! – Austin

相關問題