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

C 指向结构的指针是指向其第一个成员的指针吗?,c,pointers,struct,alignment,C,Pointers,Struct,Alignment,我正在学习如何使用C语言中的structs,并编写了以下示例: #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_

我正在学习如何使用C语言中的
struct
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
}
#包括
#包括
结构s1{
未签名短成员;
};
int main()
{
结构s1*s1_ptr=malloc(sizeof(*s1_ptr));
s1_ptr->成员=10;
printf(“成员=%d\n”,*s1_ptr);//成员=10
}
问题:是否保证在所有情况下,指向结构的指针都是指向其第一个元素的完全相同的指针

在这种特殊情况下,它的工作原理与我预期的一样,但我不确定它是否有保证。编译器可以在一开始就插入一些填充吗

我能找到的关于结构类型布局的唯一信息是
第6.2.5节类型

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

但这里并没有填充物。

嗯,也许不完全是,但至少是可浇铸的


所以你应该能够做到。

开头的填充由(我的)强调部分覆盖

结构对象中的非位字段成员和单位 哪些位字段的地址按顺序递增 它们是被宣布的。指向结构对象的指针 已转换,指向其初始成员(或如果该成员是 位字段,然后发送到它所在的单元),反之亦然。 结构对象中可能存在未命名的填充,但其位置不存在 开始


所以结构的地址就是它的第一个成员的地址。在指针转换之后,您可以从另一个指针中获得一个。

是和否。指针的类型不同,因此不(它们不完全相同)。指针指向的地址是相同的,所以是的。参见C11:指向结构对象的指针,经过适当转换后,指向其初始成员(或者如果该成员是位字段,则指向其所在的单元),反之亦然。在结构对象中可能有未命名的填充,但不是在其开始时。注意到配置文件图标:请注意,这不是(必须)类似于C++。