"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Const가 아닌 포인터를 통해 `const` 변수를 수정하는 것이 작동하는 것처럼 보이지만 실제로는 값이 변경되지 않는 이유는 무엇입니까?

Const가 아닌 포인터를 통해 `const` 변수를 수정하는 것이 작동하는 것처럼 보이지만 실제로는 값이 변경되지 않는 이유는 무엇입니까?

2024-11-07에 게시됨
검색:691

Why Does Modifying a `const` Variable Through a Non-Const Pointer Seem to Work, but Doesn\'t Actually Change Its Value?

비상수 포인터를 통해 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