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 Types的N1570:
结构类型描述顺序分配的非空成员对象集(并且在某些情况下,是不完整的数组),每个成员对象具有可选地指定的名称并且可能具有不同的类型.
但这里没有任何关于填充的信息.
开始时的填充由6.7.2.1p15(强调我的)覆盖
在结构对象中,非位字段成员和位字段所在的单元具有按声明顺序增加的地址.指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然. 结构对象中可能存在未命名的填充,但不是在其开头.
所以struct的地址是它的第一个成员的地址.在指针转换后,您可以从另一个获得一个.