#include <stdio.h>
#include <string.h>
struct my_type_t {
int x;
int y;
int z;
};
struct my_array_t {
struct my_type_t test;
int otherstuff;
};
#define GET_STRUCT_OFFSET(st, m) ((size_t) ( (char *)&((st *)(0))->m - (char *)0 ))
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
void somefunction(struct my_array_t *arrayofstructs, size_t offset, int value) {
int i;
for (i = 0; i < 5; i++) {
//Unfortunatly can't do straight assignment not an lvalue
//if you just want to use the member as a rvalue and not assign can do so normally
memcpy((((void *)&arrayofstructs
[i
].
test) + offset
), &value
, sizeof(value
)); }
}
int main(void) {
struct my_array_t arrayofstructs[5];
somefunction(arrayofstructs, GET_STRUCT_OFFSET(struct my_type_t, x), 1);
somefunction(arrayofstructs, GET_STRUCT_OFFSET(struct my_type_t, y), 2);
somefunction(arrayofstructs, GET_STRUCT_OFFSET(struct my_type_t, z), 3);
int i;
for(i = 0; i<5; i++) {
printf("Struct %d: X = %d, Y = %d, Z = %d\n",i
,arrayofstructs
[i
].
test.
x \
,arrayofstructs[i].test.y \
,arrayofstructs[i].test.z);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCnN0cnVjdCBteV90eXBlX3QgewogICAgaW50IHg7CiAgICBpbnQgeTsKICAgIGludCB6Owp9OwoKc3RydWN0IG15X2FycmF5X3QgewogICAgc3RydWN0IG15X3R5cGVfdCB0ZXN0OwogICAgaW50IG90aGVyc3R1ZmY7Cn07CgojZGVmaW5lIEdFVF9TVFJVQ1RfT0ZGU0VUKHN0LCBtKSAoKHNpemVfdCkgKCAoY2hhciAqKSYoKHN0ICopKDApKS0+bSAtIChjaGFyICopMCApKQojZGVmaW5lIEZJRUxEX1NJWkVPRih0LCBmKSAoc2l6ZW9mKCgodCopMCktPmYpKQoKdm9pZCBzb21lZnVuY3Rpb24oc3RydWN0IG15X2FycmF5X3QgKmFycmF5b2ZzdHJ1Y3RzLCBzaXplX3Qgb2Zmc2V0LCBpbnQgdmFsdWUpIHsKICAgIGludCBpOwogICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewogICAgICAgIC8vVW5mb3J0dW5hdGx5IGNhbid0IGRvIHN0cmFpZ2h0IGFzc2lnbm1lbnQgbm90IGFuIGx2YWx1ZQogICAgICAgIC8vaWYgeW91IGp1c3Qgd2FudCB0byB1c2UgdGhlIG1lbWJlciBhcyBhIHJ2YWx1ZSBhbmQgbm90IGFzc2lnbiBjYW4gZG8gc28gbm9ybWFsbHkKICAgICAgICBtZW1jcHkoKCgodm9pZCAqKSZhcnJheW9mc3RydWN0c1tpXS50ZXN0KSArIG9mZnNldCksICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiAgICB9Cn0KaW50IG1haW4odm9pZCkgewogICAgc3RydWN0IG15X2FycmF5X3QgYXJyYXlvZnN0cnVjdHNbNV07CiAgICBzb21lZnVuY3Rpb24oYXJyYXlvZnN0cnVjdHMsIEdFVF9TVFJVQ1RfT0ZGU0VUKHN0cnVjdCBteV90eXBlX3QsIHgpLCAxKTsKICAgIHNvbWVmdW5jdGlvbihhcnJheW9mc3RydWN0cywgR0VUX1NUUlVDVF9PRkZTRVQoc3RydWN0IG15X3R5cGVfdCwgeSksIDIpOwogICAgc29tZWZ1bmN0aW9uKGFycmF5b2ZzdHJ1Y3RzLCBHRVRfU1RSVUNUX09GRlNFVChzdHJ1Y3QgbXlfdHlwZV90LCB6KSwgMyk7CiAgICAKICAgIGludCBpOwogICAgZm9yKGkgPSAwOyBpPDU7IGkrKykgewogICAgICAgIHByaW50ZigiU3RydWN0ICVkOiBYID0gJWQsIFkgPSAlZCwgWiA9ICVkXG4iLGksYXJyYXlvZnN0cnVjdHNbaV0udGVzdC54IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGFycmF5b2ZzdHJ1Y3RzW2ldLnRlc3QueSBcIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsYXJyYXlvZnN0cnVjdHNbaV0udGVzdC56KTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoK
Struct 0: X = 1, Y = 2, Z = 3
Struct 1: X = 1, Y = 2, Z = 3
Struct 2: X = 1, Y = 2, Z = 3
Struct 3: X = 1, Y = 2, Z = 3
Struct 4: X = 1, Y = 2, Z = 3