2014-01-28 88 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)上,訪問未對齊的字以進行讀/寫操作並沒有性能損失。