![](/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.