我有一个结构类型的数据C:
typedef struct { type0 field0; type1 field1; } foo_struct; foo_struct foo;
现在我们假设我有一个缓冲区以某种方式分配给虚拟内存,大小为sizeof(foo_struct)
char *buf = <some allocation method>
然后我将数据从foo复制到buf,例如memcpy.
然后我想要访问buf中的字段,如下所示:
((foo_struct *)buf)->fieldn
这是保证(按照C11标准)总是工作吗?
另一个问题的人(不同的主题)
似乎是这样说,是的,这是有保证的,特别是如果buf是一致的,就像页边界一样.
是的,实际上是放心的.但我认为,无论“对齐”,页面边界如何,或者什么不是,标准没有100%的保证.在那儿?
解决方法
Can you always access suitably aligned buffer containing structure
data in C?
如果缓冲区在动态内存中,那么是的.
char *buf = malloc(1000000); if(buf) ((foo_struct *)buf)->fieldn
基本上就是这样
foo_struct *buf = malloc(1000000); if(buf) buf->fieldn
这是有保证的工作.
如果缓冲区是静态分配的或是自动的,那么不需要.
别名规则(6.5p7)阻止您执行以下操作:
/*static*/ _Alignas(foo_struct) char buf[100000000]; foo_struct* foo_p = &buf; if(foo_p) foo_p->fieldn
即使缓冲器的排列足够.
(注:1后跟很多0 ==足够大)