簡體   English   中英

如何將值分配給通過指針算術計算的內存地址?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM