你可以随时访问C中包含结构数据的适当对齐的缓冲区吗?
发布时间:2020-12-16 06:43:22 所属栏目:百科 来源:网络整理
导读:我有一个结构类型的数据C: typedef struct { type0 field0; type1 field1;} foo_struct;foo_struct foo; 现在我们假设我有一个缓冲区以某种方式分配给虚拟内存,大小为sizeof(foo_struct) char *buf = some allocation method 然后我将数据从foo复制到buf,例
我有一个结构类型的数据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标准)总是工作吗? 另一个问题的人(不同的主题) 是的,实际上是放心的.但我认为,无论“对齐”,页面边界如何,或者什么不是,标准没有100%的保证.在那儿? 解决方法
如果缓冲区在动态内存中,那么是的. char *buf = malloc(1000000); if(buf) ((foo_struct *)buf)->fieldn 基本上就是这样 foo_struct *buf = malloc(1000000); if(buf) buf->fieldn 这是有保证的工作. 如果缓冲区是静态分配的或是自动的,那么不需要. /*static*/ _Alignas(foo_struct) char buf[100000000]; foo_struct* foo_p = &buf; if(foo_p) foo_p->fieldn 即使缓冲器的排列足够. (注:1后跟很多0 ==足够大) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |