고유한 값을 출력하는 동일한 주소의 변수
다음 코드 조각을 고려하세요.
const int a1 = 40; const int* b1 = &a1; char* c1 = (char *)(b1); *c1 = 'A'; int *t = (int*)c1; cout << a1 << " " << *t << endl; cout << &a1 << " " << t << endl;
놀랍게도 이 코드는 출력:
40 65 0xbfacbe8c 0xbfacbe8c
같은 주소(c1과 t)에 있는 변수가 두 개의 다른 값('A'와 65)을 생성하는 것이 어떻게 가능합니까?
설명은 다음과 같습니다. 정의되지 않은 행동의 본질. 이 경우 상수 변수(*c1)를 수정하면 정의되지 않은 동작이 트리거됩니다. C 표준에 따르면, 정의되지 않은 동작은 프로그램 종료부터 문서화된 동작(진단 메시지 포함 또는 제외)에 이르기까지 예측할 수 없는 결과를 초래할 수 있습니다.
이 특정 사례에서 정의되지 않은 동작을 통해 컴파일러는 코드를 최적화할 수 있습니다. 예상치 못한 방법. 상수 변수를 수정함으로써 컴파일러는 a1의 원래 값을 효과적으로 재정의합니다. 그러나 이 동작은 보장되지 않으며 다양한 컴파일러 및 환경에 따라 다를 수 있다는 점에 유의하는 것이 중요합니다.
따라서 상수 변수 및 포인터로 작업할 때 예측 가능한 프로그램을 보장하려면 이러한 변수를 수정하지 않는 것이 중요합니다. 행동.
위 내용은 C에서 동일한 메모리 주소의 변수가 다른 값을 출력하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!