이 질문은 구조체 오프셋을 사용하여 포인터 산술을 사용하여 파생 된 포인터에 대한 것입니다.C++의 구조체 오프셋 및 포인터 안전성
다음 프로그램을 고려 :
는#include <cstddef>
#include <iostream>
#include <new>
struct A {
float a;
double b;
int c;
};
static constexpr auto off_c = offsetof(A, c);
int main() {
A * a = new A{0.0f, 0.0, 5};
char * a_storage = reinterpret_cast<char *>(a);
int * c = reinterpret_cast<int *>(a_storage + off_c));
std::cout << *c << std::endl;
delete a;
}
이 프로그램은 기본 설정 및 C++ 11 표준을 사용하여, 일을하고 내가 테스트를 컴파일러에 예상되는 결과를 보인다.
(우리가 대신 char *
의 void *
및 static_cast
대신 reinterpret_cast
를 사용하여 밀접하게 관련 프로그램, 보편적. gcc 5.4
문제 무효 포인터 포인터 연산에 대한 경고를 받아 들여 clang 6.0
은 void *
와 포인터 연산이라고 말한다되지 않는다 오류입니다.)
이 프로그램은 C++ 표준에 따라 잘 정의 된 동작을합니까?
구현이 완화되었거나 엄격한 포인터 안전성 ([basic.stc.dynamic.safety]
)을 사용하는지 여부에 따라 대답이 달라 집니까?
이 과제는 무엇입니까? –
@ GarrGodfrey : 놀랍습니다. –
C++의 멤버 기능에 대한 포인터를 사용하지 않는 이유는 무엇입니까? 그것은 "offsetof"에 대한 "깨끗한"대안인가? –