C에서 구조체의 첫 번째 요소는 구조체 자체와 동일한 주소를가집니다. 첫 번째 요소가 POD이면 C++의 비 POD 구조체에서도 마찬가지입니다.C++ 비 포드 시작 주소
struct bar
{
struct bar *p1, *p2;
unsigned char h;
}
struct foo
{
struct bar node;
int a;
private:
int x;
};
int main(void)
{
struct foo A;
struct bar *ptr;
ptr = &A.node;
struct foo *n = ((struct foo*)((char*)(ptr)-(unsigned long)(&((struct foo*)0)->node)));
return 0;
}
내가 "아마도을 offsetof 매크로를 잘못 사용 ... NULL 개체의 비 정적 데이터 멤버 'foo는 :: 노드'에 대한 잘못된 접근"는 얻을 :이 코드 주어진 예를 들어
, 경고.
제 질문은 -이 노드가 foo (같은 주소)의 시작 부분에 있다고 가정 할 수 있습니까?
그래, 난 그냥 재 해석 캐스트를 사용할 수 있으며, 내가 경고 얻을 경우 : C++ 구조체 공공 POD 데이터로 시작하면 객체의 첫 번째 요소 점유율 것 주소, 그래서
struct foo *o = reinterpret_cast<struct foo*>(ptr);
을 표준 당?
감사
--edit-- In a class with no virtual methods or superclass, is it safe to assume (address of first member variable) == this?는 가능한 답변으로 지적되었다. "개입 액세스 지정자없이 선언 된 (비 노조) 클래스의 비 정적 데이터 멤버는 나중에 객체가 클래스 객체 내에서 더 높은 주소를 갖도록 할당됩니다."즉, 첫 번째 요소 내 경우에는 객체 자체와 동일한 주소입니다.
표준은 그것에 대해 아무 것도 말하지 않기 때문에 나는 그럴 수 없다고 생각합니다. 구조체의 끝에있는 객체를 포인터로 변경하고 필요에 따라 객체를 할당해야 할 수도 있습니다.
C++에서'struct'는 struct 유형의 변수를 선언 할 필요가 없습니다. –
[cppreference] (http://en.cppreference.com/w/cpp/language/data_members)에서 : * "액세스 제어가 다른 멤버는 지정되지 않은 순서로 할당됩니다 (컴파일러가 함께 그룹화 할 수 있음)"* - 'bar'가 첫 번째 멤버로 할당되었다는 것을 보장 할 수 없다는 것을 의미합니다. – UnholySheep
'struct'는 가상 테이블 포인터를 가질 수 있고, 처음에 일부 플랫폼에서 알고있는 것과 일치합니다. 그래서 아니야. – Slava