동일 주소에서 변수 값 변경: 정의되지 않은 동작 이해
C에서는 데이터 유형이 다른 변수가 동일한 메모리 주소를 차지할 수 있지만, 예상치 못한 결과로 이어집니다. 다음 코드를 고려해보세요.
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;
이 코드를 실행한 후 a1과 *t 모두 값이 40이고 &a1과 t가 동일한 주소를 가질 것으로 예상할 수 있습니다. 그러나 결과는 놀랍습니다.
40 65 0xbfacbe8c 0xbfacbe8c
동일한 주소에 있는 변수가 두 개의 다른 값을 생성하는 것이 어떻게 가능합니까?
설명
이 동작은 코드의 정의되지 않은 동작으로 인해 발생합니다. 특히 a1과 같은 const 변수를 수정하는 것은 정의되지 않은 동작입니다. C 표준(섹션 7.1.6.1)에서는 수명 동안 const 객체를 수정하려고 하면 정의되지 않은 동작이 발생한다고 명시적으로 명시하고 있습니다.
이 경우 *c1(a1을 가리키는)을 수정하면 다음과 같은 결과를 얻을 수 있습니다. const 변수를 효과적으로 수정했습니다. 이것이 컴파일러가 예상되는 동작을 보장할 수 없고 대신 예측할 수 없는 결과를 생성하는 이유입니다.
이러한 경우 가능한 동작은 표준의 섹션 1.3.24에 지정되어 있습니다. 상황을 완전히 무시하는 것부터 오류 메시지와 함께 프로그램을 종료하는 것까지 다양합니다. 이 경우 컴파일러는 a1과 *t에 대해 서로 다른 값을 생성하도록 선택했습니다.
결론
정의되지 않은 동작은 C 코드에서 피해야 합니다. 예상치 못한 일관되지 않은 결과를 초래합니다. 이 특정 시나리오에서 다른 유형의 포인터를 통해 const 변수에 액세스하고 이를 수정하면 정의되지 않은 동작과 예측할 수 없는 출력이 발생합니다.
위 내용은 다른 유형의 포인터를 통해 `const` 변수를 수정하면 C에서 정의되지 않은 동작이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!