我是StackOverflow的新手,很抱歉如果已经讨论过这个话题。
我正在开发一个项目,我需要使用最少量的内存,所以我的问题是:是否可以通过使用此结构字段的地址来访问结构节点的地址。 例如,我有这样的结构:
typedef struct SLL{
char *name;
int *id;
struct SLL *next;
}SLL;
在我的代码中某处我获取了id的地址...所以可以通过使用id的地址来获取整个节点的地址吗?
答案 0 :(得分:0)
是的,你可以因为结构是连续存储的。您的问题与指针算术有关。整个节点的地址(结构指针的值)是 (SLL *)(id - sizeof(name))。
答案 1 :(得分:0)
通常,结构的地址与第一个成员的地址相同。
这依赖于编译器(我想想。请不要引用我。严重的。),并且你可能会在结构中添加填充字节,原因我不明白但希望如此注意一个更有经验的人是否要对此进行评论解释原因:V
最好的办法是从(int * id)的内存地址中减去sizeof(char *)。
答案 2 :(得分:0)
考虑offsetof <stddef.h>
:
typedef struct SLL{
char *name;
int *id;
struct SLL *next;
}SLL;
int main()
{
SLL *p=malloc( sizeof(SLL));
void *id=&p->id;
void *test= id - offsetof(SLL, id);
printf("SLL=%p test=%p\n", p, test);
return 0;
}
答案 3 :(得分:0)
是的,你可以得到它。 一旦你给这个结构一个内存,一个内存块将为此获得保留。该块将有三个指针的连续内存,如char,int和SLL类型。如果你知道指向第二个元素的指针那么只是从中得到sizeof(char *),以到达此结构的基本位置(或第一个元素)。