我開始了解鏈表在 C 中的作業方式,我對如何構建一個為鏈表生成新元素的函式有疑問:
struct elem{
int data;
struct elem* next;
};
typedef struct elem* listEl; // we call data type pointer to an element listEl;
//how to create an element
listEl createElem1(){
listEl temp;
temp = malloc(sizeof(struct elem));
(*temp).data = 0;
(*temp).next = NULL;
return temp;
}
//how to create an element
listEl createElem2(){
listEl temp;
temp = malloc(sizeof(struct elem*)); ////
(*temp).data = 0;
(*temp).next = NULL;
return temp;
}
在這里,我們將鏈表的元素定義為具有整數和指向鏈表另一個元素的指標的結構。
需要另外兩個函式來生成新的元素指標。由于我們想要生成一個新元素,我們是否應該使用該函式為我們的元素分配相關記憶體,"malloc(sizeof(struct elem))"而另一方面該函式malloc(sizeof(struct elem*));將是一個錯誤,因為我們分配的是指標的大小而不是結構的大小?
我問這個是因為在我正在關注的關于這個主題的一個講座中,創建新元素的函式已經以第二種方式定義了,在我看來它不正確。
提前致謝
uj5u.com熱心網友回復:
你的分析是正確的:
這是不正確的:
temp = malloc(sizeof(struct elem*));
因為它為指向結構的指標分配空間,而不是結構本身。隨后嘗試取消參考temp和讀取/寫入欄位將觸發未定義的行為,因為這樣做會讀取或寫入超過分配記憶體的末尾。
所以這是正確的:
temp = malloc(sizeof(struct elem));
或者更好:
temp = malloc(sizeof *temp);
因為它不依賴于temp.
uj5u.com熱心網友回復:
要創建串列的新元素,您需要創建該型別的物件
struct elem{
int data;
struct elem* next;
};
因此,您需要動態分配將包含此類物件的記憶體。因此你需要寫
temp = malloc(sizeof(struct elem));
如果該函式將檢查串列元素的記憶體是否已成功分配,則該函式會更安全。此外,該函式應該接受將分配給串列的創建節點的值。
即函式應按以下方式定義
listEl createElem1( int data )
{
listEl temp = malloc( sizeof( *temp ) );
if ( temp != NULL )
{
temp->data = data;
temp->next = NULL;
}
return temp;
}
uj5u.com熱心網友回復:
指標的大小不是固定的,因為它只保存地址的值(例如,32 位處理器上的字符指標大小為 4 個位元組,而 16 位處理器上字符指標的大小為是 2 個位元組)。
您的結構的大小將保持不變。如果您正在創建一個新結構,您可以執行以下操作:
struct elem *temp= malloc(sizeof(struct elem));
因為它分配了適當數量的記憶體
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327459.html
