我很好奇malloc()實際上是如何分配記憶體的。我正在閱讀 KNKing 的 C 編程以供參考。特別是第 17 章。最初在本章void *malloc(size_t size)中被描述為分配一個size位元組記憶體塊并回傳void *指向該記憶體塊的指標的函式。動態分配字串和陣列的兩個主要應用程式。當malloc()被呼叫時,回傳的指標將被轉換為適當的型別,例如,
int *n;
n = malloc(sizeof(*n));
malloc()回傳將被轉換為(int *). 我的理解是,由于發生這種轉換,呼叫分配的記憶體塊malloc()包含未初始化的整數。但是,在閱讀本章更多內容后,我認為我錯了,但我無法弄清楚到底發生了什么。
在閱讀關于靈活陣列成員的章節的最后一節時,發生了理解上的沖突。定義最后一個成員“不完整”的結構的想法,即
struct vstring {
int len;
char chars[];
};
然后作者繼續說,我參考:
包含靈活陣列成員的結構是不完整型別。不完整的型別缺少確定它需要多少記憶體所需的部分資訊。...特別是,不完整的型別不能是另一個結構的成員或陣列的元素。但是,陣列可能包含指向具有靈活陣列成員的結構的指標。
很明顯,我之前的理解一定是有缺陷的,否則這樣的電話,
struct vstring *str = malloc(sizeof(struct vstring) n);
將分配一個包含不完整型別的陣列。
轉換后的記憶體塊是否由malloc()特定型別的陣列分配?如果沒有,那么以下如何作業,
struct node {
int value;
struct node *next;
};
struct node *new_node = malloc(sizeof(*new_node));
new_node->value = 10;
如果呼叫分配的記憶體malloc()沒有宣告為struct node? 即使是我在文章開頭放置的整數陣列示例,我也可以通過n立即下標來訪問已分配記憶體的元素。
uj5u.com熱心網友回復:
malloc()回傳將被轉換為(int *).
沒有演員表n = malloc(sizeof(*n));。強制轉換是源代碼中的顯式運算子,就像加號是加法運算子或星號是乘法運算子一樣。強制轉換是括號中的型別名稱。在n = malloc(sizeof(*n));中,回傳的值malloc會自動轉換為 的型別n,即int *. 這是一個轉換,而不是一個演員。
轉換后的記憶體塊是否由
malloc()特定型別的陣列分配?
分配的記憶體malloc沒有宣告的型別。由于 C 標準中的形式語意和技術原因,一旦您將資料存盤到其中,它就會采用有效的型別。這在很大程度上與普通使用無關,只要您不嘗試對記憶體做任何“有趣”的事情,例如將其用作不同型別的不同型別。
如果沒有,那么以下如何作業……
一旦您已經malloc為一個物件分配了足夠的記憶體,您就可以將該物件的值存盤到分配的記憶體中。
...如果呼叫分配的記憶體
malloc()未宣告為struct node?
記憶體的有效型別由用于存盤到記憶體的左值運算式的型別決定。左值是可能指定物件的運算式。對于已宣告的物件,與 一樣int x;,物件的名稱x是它的左值運算式。當我們有一個指標時,與 一樣int *p;,then*p是指向物件的左值運算式p(假設它是指向此類物件的記憶體的有效指標,而不是空指標或無效指標)。
已分配new_node指向用 分配的記憶體malloc,然后*new_node是適當型別的左值運算式struct node,并且new_node->value是 的int成員的左值運算式struct node。使用這些左值運算式會告知編譯器如何處理這些位置的記憶體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/486412.html
