>백엔드 개발 >C++ >다른 유형의 포인터를 통해 `const` 변수를 수정하면 C에서 정의되지 않은 동작이 발생하는 이유는 무엇입니까?

다른 유형의 포인터를 통해 `const` 변수를 수정하면 C에서 정의되지 않은 동작이 발생하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-08 16:21:10498검색

Why Does Modifying a `const` Variable Through a Pointer of a Different Type Lead to Undefined Behavior in C  ?

동일 주소에서 변수 값 변경: 정의되지 않은 동작 이해

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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