How can I get/set a struct member by offset
c, struct
Solution
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;
}
Problem
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 - calculate the offset by finding the sizeof the member_a (`int`) - cast the struct to a single word pointer type (`char`?) - create an `int` pointer and set the address (to `*charpointer + offset`?) - use my `int` pointer to set the memory contents but 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