>백엔드 개발 >C++ >C에서 동일한 메모리 주소에 있는 변수가 어떻게 두 개의 다른 값을 가질 수 있습니까?

C에서 동일한 메모리 주소에 있는 변수가 어떻게 두 개의 다른 값을 가질 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-29 00:37:11162검색

How Can a Variable at the Same Memory Address Have Two Different Values in C  ?

변수 주소 불일치의 수수께끼 풀기: 정의되지 않은 동작에 대한 심층 분석

복잡한 변수 영역에서 다음과 같은 특이한 질문이 발생합니다. 동일한 주소의 변수가 두 개의 서로 다른 값을 생성하는 것이 가능합니까? 이 수수께끼를 풀기 위해 이 비정상적인 동작을 보여주는 코드 조각을 자세히 살펴보겠습니다.

다음 C 코드를 고려해보세요.

#include <iostream>
using namespace std;

int main(void) {
    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;

    return 0;
}

놀랍게도 이 코드의 출력에는 불일치가 드러납니다.

40 65
0xbfacbe8c 0xbfacbe8c

const로 선언된 변수 'a1'은 원래 값을 유지합니다. 그러나 'b1'과 동일한 메모리 위치를 가리키는 포인터인 't'는 65(ASCII의 'A') 값을 나타냅니다. 이것이 어떻게 가능합니까?

답은 정의되지 않은 동작의 개념에 있습니다. 이 경우 const 변수(이 경우 'a1')를 수정하면 C 표준(7.1.6.1)에 따라 정의되지 않은 동작이 트리거됩니다. 결과적으로 결과는 예측할 수 없게 되며 서로 다른 컴파일러 또는 심지어 동일한 코드의 서로 다른 실행에 따라 달라질 수 있습니다.

C 표준에서는 "수명 동안 const 개체를 수정하려고 하면 정의되지 않은 동작이 발생하게 됩니다"라고 명확하게 명시하고 있습니다. ." 즉, 이러한 수정의 동작은 언어에 의해 정의되지 않으며 임의의 결과가 발생할 수 있습니다.

이 특정 예에서 'c1'이 가리키는 문자의 수정(동일함) 메모리 위치를 'a1'으로 지정하면 't'를 통해 검색된 값이 예기치 않게 변경됩니다. 이는 'char'과 'int' 사이의 유형 변환이 해당 메모리 위치에 저장된 데이터의 해석을 효과적으로 재정의하기 때문입니다.

정의되지 않은 동작이 다양한 방식으로 나타날 수 있다는 점에 유의하는 것이 중요합니다. 상황을 완전히 무시하거나, 진단 메시지를 생성하거나, 프로그램을 종료하는 등의 방법이 있습니다. 따라서 예측 가능하고 안정적인 프로그램 실행을 보장하려면 프로덕션 코드에서 정의되지 않은 동작을 호출하지 않는 것이 중요합니다.

위 내용은 C에서 동일한 메모리 주소에 있는 변수가 어떻게 두 개의 다른 값을 가질 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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