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

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

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-28 08:35:02138검색

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 변수가 변경된 것처럼 보일 수 있습니다. 다음 코드를 고려해보세요.

<code class="cpp">const int e = 2;

int* w = (int*)&e;        // (1)
*w = 5;                   // (2)

cout << *w << endl;          // (3)
cout << e << endl;             // (4)</code>

이 코드를 실행하면 예기치 않은 동작이 나타납니다.

5
2

(2)에서 *w가 5로 변경되었음에도 불구하고, e는 여전히 원래 값인 2를 유지합니다. 이렇게 역설적으로 보이는 동작은 다음 요소에서 비롯됩니다.

  • (1) const 포인터(w)를 역참조하면 수정이 가능해집니다.
  • (2 ) 수정된 값은 w가 가리키는 메모리 위치에 저장되며, 이 경우 e가 저장된 메모리 위치입니다.
  • 그러나 컴파일러는 e를 컴파일 타임 상수로 처리하여 코드를 최적화합니다. 런타임에 평가하지 않습니다.

결과적으로 *w가 런타임에 평가되면 수정된 값(5)을 반환합니다. 그러나 컴파일 타임에 e가 평가되면 원래 값(2)이 사용됩니다.

이러한 동작을 C에서는 정의되지 않은 동작이라고 합니다. const 변수를 직접 또는 간접적으로 수정하면 예측할 수 없는 결과가 발생하므로 이러한 상황에서는 주의가 필요합니다.

위 내용은 Const가 아닌 포인터를 통해 `const` 변수를 수정하는 것이 작동하는 것처럼 보이지만 실제로는 값이 변경되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.