예를 들어,이 코드가 유효합니까 아니면 별칭 규칙을 위반하여 정의되지 않은 동작을 호출합니까?구조체 별칭은 초기 및 유일한 멤버가 될 수 있습니까?
int x;
struct s { int i; } y;
x = 1;
y = *(struct s *)&x;
printf("%d\n", y.i);
별칭 읽기를 수행하기위한 이식 가능한 방법을 개발하기 위해이 기술을 사용하는 데 관심이 있습니다.
업데이트 : 여기에 의도 된 사용의 경우, 약간의 차이가 있지만 위의 유효한의 경우에만 유효합니다
static inline uint32_t read32(const unsigned char *p)
{
struct a { char r[4]; };
union b { struct a r; uint32_t x; } tmp;
tmp.r = *(struct a *)p;
return tmp.x;
}
GCC, 원하는대로, 32 단일이 컴파일 비트로드가 발생하고 p
이 실제로 char
이외의 유형을 가리키는 경우 발생할 수있는 별칭 문제를 피하는 것으로 보입니다. 즉, GNU C __attribute__((__may_alias__))
속성을 대체 할 수있는 대체 기능으로 보인다. 하지만 C 표준에서
에서 재 작업되었습니다. – OldProgrammer
** 이것은 완벽하게 유효합니다. ** 표준의 정확한 부분/인용문을 기억하지 못하지만이를 수행 할 수 있습니다. 마치 첫 번째 구조체의 초기 멤버를 공유하는 구조체를 가리키는 포인터를 통해 구조체의 별칭을 지정할 수 있습니다. –
@ H2CO3 그래서 패딩은 * 필드 사이에서만 발생할 수 있습니까? – Elazar