S # 39, 첫 번째 there& 구조체입니다 유형:
typedef struct {
int a;
int b;
} foo_t;
이로써 복제본에 어졌다면 there& # 39 의 기능 등 구조체입니다:
void bar(foo_t *inp)
{
foo_t l;
...
memcpy(&l.a, &inp->a, sizeof(foo_t));
...
}
왜 한 want to use this 스타일입니까?
아닌.
memcpy(&l.a, &inp->a, sizeof(foo_t));
그렇게 할 수 있습니다.
memcpy(&l, inp, sizeof(foo_t));
모두 같은 일을 할 수 있지만, 실제로 위험하고 잘못된 제표를 캜 하면 다음과 같은 구조를 전에 없는 패딩 첫 번째 멤버.
하지만 이제 막 가장 간단한 구조를 사용하여 객체를 복사하는 대입 연산자입니다:
l = *inp;
내 생각엔. 무지나 나쁜거라 있기 때문입니다.
이 코드는 때문에 메맥피 구조체입니다 멤버가 재정돈 안전하지 않은 결과를 가져올 수 있습니다 '' 의 멤버 'a' 는 더 이상 구조체입니다 넘어 액세스하면 니며 경우 첫 번째 멤버.
그러나 it& # 39 의 멤버가 가능성도 있다는 것이다, 그 중 일부입니까 복제본에 내의 오더할 의도적으로 구조체입니다 및 프로그래머용 디렉토리에만 시작 멤버 'a', '를 통해 끝날 때까지 구조체입니다. # 39 의 경우 다음 코드를 만들 수 있는 안전한 that& 경우 다음 변경:
memcpy(&l.a, &inp->a, sizeof(foo_t) - offsetof(foo_t, a));
현재 멤버 '로' 결코 있을 수 있으며, 이 모든 구조체입니다 주문하십시오 메맥피 검색하기를 니며 아웃해야 주었다.
이미 이러한 다른 지적했다. 그 어느 날 버그를 로만스였나:
struct Foo rgFoo [3];
struct Foo *pfoo = &rgFoo [0];
대신
struct Foo *pfoo = rgfoo;
왜 이 어레이에는 인덱스화할 데레프 의해 다음 시행하십시오 주소 다시? # 39 의 it& 이미 주소, 다만 기술적으로 에로남이네 프로 메모
struct Foo *const,
없습니다.
struct Foo *.
아직 내가 사용한 첫 번째 항상 볼 수 있습니다.
실제로 한 것은 정당한 览侩 荤례 엔드입니다: 바른 클래스 계층.
구조체 다룰 때 클래스로 인스턴스에서는 첫 번째 구성원, 즉 오프셋된 0) 는 일반적으로 포지셔닝합니다 상위 유형 인스턴스입니다. 수퍼 유형의 경우 존재합니다. 따라서 간단한 캐스트 이동합니까 사용 간에 하위형식 vs. 이 상위 유형. 매우 유용합니다.
아니, 차라리 다른 case_ 제안하세요 _in 피하는 대신 직접 구성원 등을 이유로 이 패턴과 액세스하면 이미 언급했다.