Discussion:
offsetof und eingebettete Felder
(zu alt für eine Antwort)
Rainer Weikusat
2017-11-06 17:25:54 UTC
Permalink
Raw Message
Fuer Code, der den Inhalt eines Feldes, welches Mitglied einer Struktur
ist, in etwas umwandeln soll, das man in Perl benutzen kann, brauche ich
einen generischen Weg, auf die Feldelemente zuzugreifen.

Etwas in der Art von

----
#include <stddef.h>
#include <stdio.h>

struct astruct {
int vs[4];
};

static struct astruct as = {
.vs = { 3, 2, 1, 0 }
};

int main(int argc, char **argv)
{
int *pi;

pi = (int *)((char *)&as + offsetof(struct astruct, vs[2]));
printf("%d\n", *pi);

return 0;
}
-----

wuerde sehr gut zu anderm, bereits existierendem Code passen. Die
Bedingung das

The type and member designator shall be such that given

static type t;

then the expression &(t.member-designator) evaluates to an
address constant.

wird hier offentlichlich erfuellt, allerdings bezeichnet der geplante
'member designator' ein Mitglied eines Mitgliedes. Eine ueber obiges
hinausgehende Definition von 'member designator' gibt es nicht.

?
Stefan Reuther
2017-11-06 17:41:22 UTC
Permalink
Raw Message
Post by Rainer Weikusat
pi = (int *)((char *)&as + offsetof(struct astruct, vs[2]));
[...]
Post by Rainer Weikusat
The type and member designator shall be such that given
static type t;
then the expression &(t.member-designator) evaluates to an
address constant.
wird hier offentlichlich erfuellt, allerdings bezeichnet der geplante
'member designator' ein Mitglied eines Mitgliedes. Eine ueber obiges
hinausgehende Definition von 'member designator' gibt es nicht.
Ich würde 'member-designator' hier einfach als den Namen des formalen
Parameter des offsetof-Makros sehen, nicht als eine Grammatikproduktion.

Wichtig ist halt, dass es eine 'address constant' wird, und die ist in
§6.6(9) erklärt. "The array-subscript [] and member-access . and ->
operators, the address & and indirection * unary operators, and pointer
casts may be used in the creation of an address constant, but the value
of an object shall not be accessed by use of these operators."


Stefan

Loading...