Ignoring padding/alignment issues and given the following struct, what is best way to get and set the value of member_b without using the member name.
struct mystruct { int member_a; int member_b; } struct mystruct *s = malloc(sizeof(struct mystruct));
Put another way; How would you express the following in terms of pointers/offsets:
s->member_b = 3; printf("%i",s->member_b);
My guess is to
int
)char
?)int
pointer and set the address (to *charpointer + offset
?)int
pointer to set the memory contentsbut I get a bit confused about casting to a char type or if something like memset
is more apropriate or if generally i'm aproching this totally wrong.
Cheers for any help
Use offsetof() to find the offset from the start of z or from the start of x . #include <stddef. h> size_t offsetof(type, member); offsetof() returns the offset of the field member from the start of the structure type.
A structure T cannot contain itself.
The approach you've outlined is roughly correct, although you should use offsetof
instead of attempting to figure out the offset on your own. I'm not sure why you mention memset
-- it sets the contents of a block to a specified value, which seems quite unrelated to the question at hand.
Here's some code to demonstrate how it works:
#include <stdio.h> #include <stdlib.h> #include <stddef.h> typedef struct x { int member_a; int member_b; } x; int main() { x *s = malloc(sizeof(x)); char *base; size_t offset; int *b; // initialize both members to known values s->member_a = 1; s->member_b = 2; // get base address base = (char *)s; // and the offset to member_b offset = offsetof(x, member_b); // Compute address of member_b b = (int *)(base+offset); // write to member_b via our pointer *b = 10; // print out via name, to show it was changed to new value. printf("%d\n", s->member_b); return 0; }
The full technique:
Get the offset using offsetof:
b_offset = offsetof(struct mystruct, member_b);
Get the address of your structure as a char * pointer.
char *sc = (char *)s;
Add the add the offset to the structure address, cast the value to a pointer to the appropriate type and dereference:
*(int *)(sc + b_offset)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With