비상수 포인터를 통해 const 수정
C에서는 일단 초기화되면 const 변수를 수정할 수 없습니다. 그러나 특정 시나리오에서는 const 변수가 변경된 것처럼 보일 수 있습니다. 다음 코드를 고려해보세요:
const int e = 2;
int* w = (int*)&e; // (1)
*w = 5; // (2)
cout 이 코드를 실행하면 예기치 않은 동작이 나타납니다.
5
2
(2)에서 *w가 5로 변경되었음에도 불구하고 e는 여전히 원래 값인 2를 유지합니다. 이 역설적인 동작은 다음 요소에서 비롯됩니다.
- (1 ) const 포인터(w)를 역참조하면 수정이 가능합니다.
- (2) 수정된 값은 w가 가리키는 메모리 위치에 저장되며, 이 경우 e가 저장된 메모리 위치입니다.
- 그러나 컴파일러는 e를 컴파일 타임 상수로 처리하고 런타임에 평가하지 않고 코드를 최적화합니다.
결과적으로 *w가 런타임에 평가되면 다음을 반환합니다. 수정된 값(5). 그러나 e가 컴파일 타임에 평가되면 원래 값(2)이 사용됩니다.
이 동작은 C에서 정의되지 않은 동작으로 알려져 있습니다. const 변수를 직접 또는 간접적으로 수정하면 예측할 수 없는 결과가 발생하므로 이러한 상황에서는 주의가 필요합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3