2015-04-03 104 views
2

就像如果我有:通過指向其中一個成員的指針來確定對象指針的最佳方法是什麼?

struct S 
{ 
    std::size_t szArray; 
    int dArray[]; 
} ; 

int main() 
{ 
    extern int (*pArr)[]; //pointer to member 'dArray' of object with type 'S' 

    S *pStruct = /*??????????*/; //pointer to the object 
} 

是什麼讓這個指針的最佳方式?

+1

你知道數組自然衰變到指向他們第一個元素的指針嗎?此外,標準C++不支持結構中的靈活數組,如果在結構中有一個數組,它必須在編譯時有一個大小,否則使用['std :: vector'](http://en.cppreference的.com /瓦特/ CPP /容器/載體)。 – 2015-04-03 11:01:21

+0

我知道,但我想使用指向數組的指針,以保留指向多個對象而不是一個對象的信息。無論如何 - 我不知道爲什麼我留下這樣的印象,即C++支持靈活的數組,但在每種情況下都不會改變這種情況。 – AnArrayOfFunctions 2015-04-03 11:25:10

回答

3

沒有好辦法做到這一點。

唯一支持方式是

#include <cstddef> // for offsetof 

S *pStruct = reinterpret_cast<S*> 
    (reinterpret_cast<char*>(pArr) - offsetof(S, dArray)); 

要注意的是offsetof僅針對標準佈局類型良好定義的,並且該標準C++不允許未施膠數組作爲類成員。除非你有充分的理由使用C語言,否則我建議std::vector<int>會更安全,更方便。

+0

我會把'static_assert(std :: is_standard_layout (),「S必須是標準佈局才能工作。」);'在那裏(a)明確發生了什麼,以及(b)future-證明。 – Casey 2015-04-03 20:30:37

+0

可以使用大小爲1的數組來替換空數組。在數組結束後分配「額外空間」的技術可能是有效的?並且「過度索引」可能會保證工作?但我不確定。如果不能保證,它應該是,因爲它是一種非常典型的C技術,我不能想到一個不適用於它的實現(使用POD類型)。有趣的是,你可能需要2個結構 - 一個只有大小,一個大小和一個元素數組 - 以使標準佈局保證爲你工作。 – Yakk 2015-04-03 20:44:59

+0

@Yakk:是的,如果你有一個很好的理由,這個成語可以用C++編寫。但正如我所說,你需要一個很好的理由,因爲它比相當的C++習慣用法要安全和方便得多。 – 2015-04-04 00:02:34

相關問題