我在文件中有一些二进制数据并将文件加载到内存中char* data
。现在我知道例如在偏移123处开始struct something
。C结构的对齐
是否安全,做结构的以下
(struct something*) (data + 123) // ??&data [123]??
,然后访问的成员。或者我应该像
struct something record;
memcpy (&record, data + 123, sizeof (struct something));
甚至完全不同的东西?
我的问题是主要动机,是因为我对“内存对齐”,“单词边界”等一些模糊的回忆......
非常感谢。我担心如此,我会坚持'memcpy'。请注意:'data + 123','&data [123]'和'&123 [data]'之间是否有区别?或者只是语法糖? – Hyperboreus
@Hyperboreus:为了您的目的,这些表达式之间没有区别。 (我很想说没有,除了你可能需要括号来避免优先级问题;例如'指针 - 数据+ 123'与'指针 - &数据[123]'不同,而指针 - (数据+ 123) '和后者一样,但为了确保即使在深奥的情况下也没有差异,我必须检查C标准,并且此刻我被迫按时。) –
一面注意: -in'memcpy'经常在与未对齐的数据一起使用时导致转储,因此如果遇到该问题(依赖于编译器),您可能需要禁用内置的'memcpy'和'memmove'(并使用libc版本)。 –