아니요,하지만 이것은 메모리가 할당되어 문자 유형을 사용하여 기록되기 때문입니다.
메모리는 malloc을 사용하여 할당됩니다. 이 객체는 malloc으로 할당 되었기 때문에 으로 선언하지 않았습니다. 따라서 객체에는 효과적인 유형이 없습니다.
그런 다음 코드는 char
유형을 사용하여 개체에 액세스하고 수정합니다. 타입 2char
하고 효율적인 형태를 갖는 어떤 개체 5가 복사이 이후의 액세스를위한 char
에 효과적인 형태를 설정하지 않고 복사되지 않고, 단 기간 동안, char
에 효과적인 유형을 설정으로서 액세스 . 액세스 후에는 오브젝트에 더 이상 효과적인 유형이 없습니다.
그런 다음 유형이 int
인 경우 해당 객체에 액세스하고 읽기 전용으로 사용됩니다. 객체가 유효한 유형이 아니기 때문에, 읽는 동안 객체는 int
이됩니다. 액세스 후에는 객체에 더 이상 유효한 유형이 없습니다. int
이 분명히 유효한 유형 int
과 호환 되었기 때문에 동작이 정의됩니다.
(값이 int
트랩 표현하지 읽기 가정.)
하는
당신이 액세스하고도 int
와 호환되지 않는 문자 형식을 사용하여 객체를 수정 더라면, 행동이 정의되지 않은 것 .
의 당신의 예 (sizeof(float)==sizeof(int)
가정) 한 가정 해 봅시다 :
int i;
void *buf = calloc(5, sizeof(float)); // buf initialized to 0
{
float *ptr1 = buf;
for(i = 0; i < 5*sizeof(float); ++i)
ptr1[i] = (float)i;
}
int *ptr2 = buf;
for(i = 0; i < 5; ++i)
printf("%d", ptr2[i]);
float
의가에 기록되고있는 객체의 유효 유형, 쓰기의 기간과 이후의 모든 들어, float
의된다 객체를 수정하지 않는 객체에 액세스 . 그런 다음 해당 객체가 int
에 의해 액세스 될 때 값은 읽기 전용으로 변경되기 때문에 유효 유형은 float
으로 유지됩니다. float
을 사용한 이전의 쓰기는이 객체에 대한 다음 쓰기 (이 경우에는 발생하지 않음) 때까지 유효 유형을 float
으로 영구적으로 설정합니다. int
및 float
유형은 과 호환되지 않으므로 동작이 정의되지 않습니다.
을 (: ISO 아래 모든 텍스트에서 인용 IEC 9899 : 201x)
1은 (6.5 식 6)
그 저장된 값에 액세스하기위한 오브젝트의 유효 유형 인 객체의 선언 된 형태 (존재하는 경우) 87) 할당 된 객체에는 선언 된 유형이 없습니다.
2
(6.5 식 6)
이 값은 캐릭터 타입없는 타입
갖는 좌변을 통해 더 선언 유형을 갖지 않는 개체에 저장되어있는 경우, 그 좌변의 유형은 실효된다 해당 액세스에 대한 오브젝트 유형 및 저장된 값을 수정하지 않는 후속 액세스에 대한 오브젝트 유형. 3
(6.5 식 6)이 다른 어떤 유형 선언이없는 개체에 대한 액세스를 위해
객체의 유효 입력은 단순히 접속을 위해 사용되는 좌변의 유형이다. 객체의 유효 유형과 호환 형 - 88) : 4
(6.5 식 8)
목적은 저장된 값 하나 다음 유형 갖는다 좌변 식에서만 액세스 가진다 , - 객체의 유효 유형과 호환되는 유형의 정규화 된 버전 - 객체의 유효 유형에 해당하는 부호가 있거나 부호없는 유형 인 유형 - 유형이 부호가 있거나 부호가없는 유형 유효한 유형의 유효 형식에 해당하는 (6.5 표현식 6)
값이 memcpy 또는 memmove를 사용하여 선언 된 유형이없는 객체로 복사되거나 문자 유형의 배열로 복사 된 경우 해당 액세스 및 이후 액세스에 대해 수정 된 객체의 유효 유형 값을 수정하지 않음 은 값이 복사되는 객체의 유효한 유형입니다 (있는 경우).
내가 생각하지 못한 흥미로운 점을 암시 적으로 제기한다 : 할당 된 메모리가'int' 값을 통해 할당되지 않았기 때문에, 6.5 절 6 절에'int'가되지 않을까? 'int * '를 통해 참조 해제되는데, 결국 엄격한 앨리어싱을 위반하게됩니까? 그 단락을 분석하는 것은 고통 스럽다. –
그 시점에서 문자에만 개체에 기록 된 및 그 개체에 유효한 형식을 설정하지 않았습니다. 선언 된 타입이없는 객체에 대한 다른 모든 접근의 경우, 객체의 유효 타입은 단순히 접근에 사용 된 lvalue의 타입 일뿐입니다 * – 2501
같은 포인트에서'int '가 읽기 대신 객체에 쓰여지는 경우 다음과 같은 이유로 유형이 'int'가됩니다. * 값이 문자 유형이 아닌 유형을 가진 lvalue를 통해 선언 된 유형이없는 객체에 저장되는 경우 lvalue의 타입은 해당 액세스와 저장된 값을 수정하지 않는 후속 액세스에 대한 객체의 효과적인 유형이됩니다. * – 2501