2015-04-03 85 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