![](/img/trans.png)
[英]How do I "assign" the value in `CArray` that contains a memory address to a `Pointer`?
[英]How to assign value to a memory address calculated by pointer arithmetic?
我需要創建一個完全通用的鏈表,其中可以包含枚舉指定的任何類型的數據...
列表的節點具有以下結構:
__________________
|_____|_____|_____|
第一個字段的大小為sizeof(nodeType)字節,其中包含存儲的信息類型。 下一個字段的地址包含信息變量的地址。 下一個字段具有下一個節點的地址,該地址可以是簡單節點或另一個鏈表。
基本上,我有一個nodeType枚舉為:
typedef enum{
STRING, INT, NIL, LIST
} nodType;
我已經將內存分配給這樣的節點指針:
nodeType* node = malloc(sizeof(nodeType) + 2*sizeof(char*));
第一個sizeof(nodeType)字節包含存儲的信息類型。 我通過表達式為它分配了值STRING:
*node = STRING;
現在,我希望下一個sizeof(char *)字節存儲char *指針的地址。 (一台機器上的所有指針大小都相同嗎?(是的,根據我的意思)。)因此,我為其分配了一個值,例如:
char* str = strdup("Hello");
(char**)(char*(node) + sizeof(nodeType)) = &str;
但是GCC會標記錯誤,因為賦值運算符的LHS不是左值。我需要為該地址賦值,以便繼續構建該列表。 除了使用struct之外,在c中還有一些優雅的方法嗎?
您忘記了取消引用:
*(char***)((char*)node + sizeof(nodeType)) = &str;
解引用操作的結果始終是左值。 通常,如果要將內存位置p
視為指向T
類型的變量,則需要將其強制轉換為T *
並取消引用:
*(T*)(p) = my_t_value;
這適用於T = char **
和p = (char *) node + sizeof(nodeType)
。
但這只是糟糕的設計。 理智的人不能含有***
。 而且,通過假設所有元素在內存中連續跟隨,您有可能違反對齊約束。 更簡單的方法是這樣的:
struct Node
{
struct Node * next;
nodType type;
void * data;
};
用法:
struct Node * p = malloc(sizeof *p);
p->next = NULL;
p->type = STRING;
p->data = str;
請注意,我選擇將字符串直接存儲為char *
,而不是作為char *
的指針。 統一主題應該是列表節點擁有p->data
並說free(p->data);
無條件刪除節點時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.