최근에 엄격한 앨리어싱 규칙이 적용되었지만 void *
을 사용하여 규칙을 위반하지 않고 유형을 수행하는 방법을 이해하는 데 문제가 있습니다.C99에서 엄격한 앨리어싱 규칙을 위반하지 않고 void *로 입력하십시오.
나는이 규칙 나누기 알고
int x = 0xDEADBEEF;
short *y = (short *)&x;
*y = 42;
int z = x;
을 그리고 나는 안전하게 유형 말장난에 대한 C99의 조합을 사용할 수 있다는 것을 알고 :
union{
int x;
short y;
} data;
data.x = 0xDEADBEEF;
data.y = 42;
int z = data.x;
하지만 어떻게 안전하게 void *
에 사용합니까 C99에서 유형 - 실행을 수행 하시겠습니까? 올바른 다음과 같다 :
int x = 0xDEADBEEF;
void * helper = (void *)&x;
short *y = (short *)helper;
*y = 42;
int z = x;
내가 그 코드는 여전히 변수
x
의 주소의 메모리부터 엄격한 앨리어싱 규칙을 깰 것 생각하는 것은 모두
x
와 역 참조
y
에 의해 변경 될 수 있습니다.
형식 지정이 void *
을 통해 정의되지 않은 경우 C99에서 void *
의 목적은 무엇입니까?
오오알이 보입니다. 그래서'void * '가 사용되는 경우 프로그래머는 형변환을위한 올바른 타입을 이미 알고 있어야합니다. 원래의 데이터 유형 (즉,'int *'->'void *'->'int *')이 사용되기 때문에 아무런 형벌도 발생하지 않습니다. –
네, 그렇습니다. +1 –
내가 틀릴 수도 있지만,'unsigned char'가 아닌 별명을 지정할 수있는'char'만이 아닌가? – Arnout