在C中,指向结构的指针总是指向其第一个成员吗?

Ste*_*eve 32 c

假设我有许多C结构,我想要一组特定的函数来操作.

我想知道以下是否是合法的方法:

typedef struct Base {
     int exampleMember;
     // ...
} Base;

typedef struct Foo {
     Base base;
     // ...
} Foo;

typedef struct Bar {
     Base base;
     // ...
} Bar;

void MethodOperatesOnBase(void *);

void MethodOperatesOnBase(void * obj)
{
     Base * base = obj;
     base->exampleMember++;
}
Run Code Online (Sandbox Code Playgroud)

在示例中,您将注意到两个结构FooBarBase成员开头.

而且,在MethodOperatesOnBase那里,我将void *参数转换为Base *.

我想传递指针Bar和指向Foo此方法的指针,并依赖结构的第一个成员作为Base结构.

这是可以接受的,还是有一些(可能是编译器特定的)问题需要注意?(比如某种类型的打包/填充方案会改变结构的第一个成员的位置?)

Hen*_*olm 38

是的,C标准特别保证这将起作用.

(C1x§6.7.2.1.13:"指向结构对象的指针,适当转换,指向其初始成员......反之亦然.在结构对象中可能有未命名的填充,但不在其开头.")