指向struct的指针是指向其第一个成员的指针吗?

St.*_*rio 4 c struct pointers alignment

我正在学习如何struct在C中使用s并编写以下示例:

#include <stdio.h>
#include <stdlib.h>

struct s1{
    unsigned short member;
};

int main()
{
    struct s1 *s1_ptr = malloc(sizeof(*s1_ptr));
    s1_ptr -> member = 10;
    printf("Member = %d\n", *s1_ptr); // Member = 10
}
Run Code Online (Sandbox Code Playgroud)

问题:在所有情况下,指向结构的指针是否与指向其第一个元素的指针完全相同?

在这个特殊的情况下,它按照我的预期工作,但我不确定它是否有保证.编译器是否可以在一开始就插入一些填充?

唯一我能找到的有关结构类型的布局是Section 6.2.5 TypesN1570:

结构类型描述顺序分配的非空成员对象集(并且在某些情况下,是不完整的数组),每个成员对象具有可选地指定的名称并且可能具有不同的类型.

但这里没有任何关于填充的信息.

Sto*_*ica 8

开始时的填充由6.7.2.1p15(强调我的)覆盖

在结构对象中,非位字段成员和位字段所在的单元具有按声明顺序增加的地址.指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然. 结构对象中可能存在未命名的填充,但不是在其开头.

所以struct的地址是它的第一个成员的地址.在指针转换后,您可以从另一个获得一个.