Hi,

Am 02.02.20 um 08:44 schrieb aotto:
Hi, the following scenario has a "definition hole" in the "C" language

code example:

-------------------------
struct base {
  ...
};

struct A {
  struct base obj;
  ...
} aObj;

struct B {
  struct base obj;
  ...
} bObj;

void method_base (struct base * hdl, ...);

method_base(&aObj, ...)
method_base(&bObj, ...)
------------------------

- a POINTER to "A" is also a valid POINTER to "base"
- a POINTER to "B" is also a valid POINTER to "base"

No. The order of elements of structures in memory is implementation defined and not guaranteed to be the order of enumeration in the definition.
The ONLY valid and portable way to express the call is

  method_base(&aObj.obj, ...)
  method_base(&bObj.obj, ...)

- a POINTER to "base" is NOT a valid POINTER to "A" and "B"

of course not. It is a pointer to one element within a structure, not to the structure itself.

Just my 2 cents,
Holger

Reply via email to