[英]C Linked List with dynamic node size
我試圖在C中創建一個鏈表,其中每個節點在程序啟動時都有用戶輸入的特定大小。 我已經想到了一個結構:
struct ListNode{
char * str;
struct ListNode * next_node;
};
但是這里每個節點的大小是固定的。 有任何想法嗎?
非常感謝。
似乎您需要節點每次更改的數據大小。 您可以通過使用一個固定大小的節點來實現此目的,該節點擁有一個指向動態分配的數據的指針。
請注意,在下面的示例中,結構大小保持為sizeof(void *)+ sizeof(node *),但為每個節點分配的數據大小使用用戶輸入進行更改。
typedef struct Dnode
{
void* data;
struct Dnode* next;
}Dnode;
Dnode* CreateDnode(size_t data_size_bytes)
{
Dnode* newNode = NULL;
newNode = malloc(sizeof(Dnode));/*always the same*/
if(NULL == newNode)
{
return NULL;
}
newNode->data = malloc(data_size_bytes);/*changes by input*/
if(NULL == newNode->data)
{
return NULL;
}
newNode->next = NULL;
return newNode;
}
聽起來您可能正在尋找“柔性數組成員”功能,即將不完整的數組放置在結構的末尾:
struct ListNode {
struct ListNode *next;
char data[];
};
分配方式如下:
struct ListNode *node = malloc(sizeof *node + data_size_bytes);
然后,我們可以在存儲值的node->data[i]
為i
從0
到data_size_bytes - 1
。 整個結構和數據在一個線性塊中。
請注意,具有彈性成員的結構不能用作數組元素類型。
在ISO C標准於1999年添加靈活數組成員之前,它是使用大小為1的數組作為流行的“結構黑客”來完成的。如果您不得不在C90中工作,它將像這樣:
struct ListNode {
struct ListNode *next;
char data[1];
};
現在, sizeof ListNode
的sizeof ListNode
包括一個元素數組, 並且很有可能用填充來對齊。 例如,在具有四個字節指針的系統上,大小很可能為八。 如果我們使用相同的malloc
行,我們將分配多余的內存。 用於C90結構hack的正確的malloc
表達式:
#include <stddef.h>
struct ListNode *node = malloc(offsetof(struct ListNode, data) + data_size_bytes);
與靈活數組成員功能不同,struct hack沒有形式上明確定義的行為。 它只是“如果有效就可以工作”的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.