2014-01-28 84 views
2

我在文件中有一些二进制数据并将文件加载到内存中char* data。现在我知道例如在偏移123处开始struct somethingC结构的对齐

是否安全,做结构的以下

(struct something*) (data + 123) // ??&data [123]?? 

,然后访问的成员。或者我应该像

struct something record; 
memcpy (&record, data + 123, sizeof (struct something)); 

甚至完全不同的东西?

我的问题是主要动机,是因为我对“内存对齐”,“单词边界”等一些模糊的回忆......

回答

6

是的,你应该使用memcpy,没有指针的转换,对于完全相同的原因你讨论:对齐。转换指针并不安全。如果对齐方式不正确,则使用生成的指针时的行为不受C标准的保证。

在某些情况下的替代方法是将数据直接读入对象。

+0

非常感谢。我担心如此,我会坚持'memcpy'。请注意:'data + 123','&data [123]'和'&123 [data]'之间是否有区别?或者只是语法糖? – Hyperboreus

+0

@Hyperboreus:为了您的目的,这些表达式之间没有区别。 (我很想说没有,除了你可能需要括号来避免优先级问题;例如'指针 - 数据+ 123'与'指针 - &数据[123]'不同,而指针 - (数据+ 123) '和后者一样,但为了确保即使在深奥的情况下也没有差异,我必须检查C标准,并且此刻我被迫按时。) –

+0

一面注意: -in'memcpy'经常在与未对齐的数据一起使用时导致转储,因此如果遇到该问题(依赖于编译器),您可能需要禁用内置的'memcpy'和'memmove'(并使用libc版本)。 –

0

这取决于。尽管某些特定的指令可能需要对齐操作数(如PPC上的CAS指令),但在一些现代CPU(如x86)上,访问未对齐的字以进行读/写操作并没有性能损失。