简体   繁体   中英

Access first variable of a structure from a pointer that points to a different variable in the structure

Consider the following code fragment:

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;

Now using pointer, which is set to point to the last element in the structure, how can one use that pointer to access the first element in the structure ( data1 )?

Normally, what I would do in this case is back up the pointer by so many words to point to that element, but there is a problem. The pointer variable next in the middle of the structure has a varying size depending on the platform. If this is running on a 32-bit platform, then the pointer is 4 bytes while on a 64-bit platform, the pointer takes up 8 bytes. A similar issue happens with the size_t datatype as well.

Although not clear in the example, the structure is the header to a block of memory that is variable in size and is part of a linked list. AKA a free list in a memory allocator. Other than using some kind of an initialization that calculates the size of the pointer itself, is there a portable way of getting the address of the first element of the structure?

You can use offsetof to know how far a member is from the start of the structure. In this case:

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

Obviously this requires you to know that the pointer is pointing at a data4 already, there's no way to autodetect that or anything. And, of course, it would be preferable to use a code design where you pass around the struct data * in the first place.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM