从指向结构

时间:2016-03-13 22:15:57

标签: c pointers struct

考虑以下代码片段:

struct data_t {
    int data1;
    int data2;
    struct data_t *next;
    size_t size;
    int data3;
    int data4;
};

int *ptr;
struct data_t data;

...

ptr = &data.data4;

现在使用指针(设置为指向结构中的最后一个元素),如何使用该指针访问结构中的第一个元素(data1)?

通常情况下,在这种情况下我要做的是用很多单词备份指针以指向该元素,但是存在问题。结构中间的指针变量next具有不同的大小,具体取决于平台。如果这是在32位平台上运行,那么指针是4字节,而在64位平台上,指针占用8个字节。 size_t数据类型也会出现类似的问题。

虽然在示例中不清楚,但结构是内存块的标头,其大小可变并且是链接列表的一部分。 AKA是内存分配器中的空闲列表。除了使用某种计算指针本身大小的初始化之外,是否有一种可移植的方法来获取结构的第一个元素的地址?

1 个答案:

答案 0 :(得分:5)

您可以使用offsetof来了解成员离结构一端的距离。在这种情况下:

struct data_t *p = (struct data_t *)( (char *)ptr - offsetof(struct data_t, data4) );

显然这需要你知道指针已经指向data4,没有办法自动检测那个或任何东西。当然,最好使用代码设计,首先传递struct data *