IRC의 누군가와 토론을했고이 질문이 나타났습니다. 표준에 따라 유형 int
의 객체를 char
lvalue로 변경할 수 있습니다.앨리어싱 규칙이 대칭입니까?
int a;
char *b = (char*) &a;
*b = 0;
정렬을 잘하면 반대 방향으로이 작업을 수행 할 수 있습니까?
제가 보는 문제는 앨리어싱 규칙이 하나가
int a;
a = 0;
이유는 비 대칭 관계로 앨리어싱 규칙을 고려하면, 다음의 간단한 경우를 포함 각 것을하지 않는다는 것입니다 객체는 sizeof(obj)
unsigned char
객체의 시퀀스 ("객체 표현"이라고 함)를 포함합니다. int
을 변경하면 해당 개체의 일부 또는 전부가 변경됩니다. 그러나 앨리어싱 규칙에는 int
을 char
또는 unsigned char
으로 변경할 수 있지만 다른 방법은 사용할 수 없다고 명시되어 있습니다. 또 다른 예는
int a[1];
int *ra = a;
*ra = 0;
하나 개의 방향은 3.10/15 ("포함 ... 집계 또는 조합 유형")에 의해 설명하지만 이번에는 우리는 요소가 주변의 다른 방법 ("A 형식이 필요합니다 또는 집계의 비 정적 데이터 멤버 유형 ... ").
다른 방향이 암시되어 있습니까? 이 질문은 C에도 적용됩니다.
"반대 방향"이란 의미를 나타내는 코드를 추가해주십시오. 어떤 코드가 허용되지 않을 것이라고 생각하십니까? –
@Rob 내가 보여 준 줄 알았는데. 어쩌면 나는 실패했다. 'a = 0'뿐만 아니라'a = 0'도 허용되지 않을 수도 있습니다. "A foo bar"의 "반대 방향"은 "foo에 포함 된 막대"를 의미합니다. 특히 불분명 한 점은 무엇입니까? –
뜻한다면'char a = 'A'; int * pi = (int *) a; * pi = 'B';'그렇다면 그런 것은 처음부터 안전하다고 생각하지 않습니다. – Nawaz