> 백엔드 개발 > C++ > C에서 널 포인터를 사용하여 정적 멤버에 액세스하는 것이 허용되는 반면 비정적 멤버에 액세스하면 정의되지 않은 동작이 발생하는 이유는 무엇입니까?

C에서 널 포인터를 사용하여 정적 멤버에 액세스하는 것이 허용되는 반면 비정적 멤버에 액세스하면 정의되지 않은 동작이 발생하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-02 05:40:29
원래의
883명이 탐색했습니다.

Why is accessing static members using null pointers allowed in C  , while accessing non-static members results in undefined behavior?

C에서 널 포인터를 사용하여 정적 멤버에 액세스

C에서는 널 포인터를 통해 비정적 클래스 멤버에 액세스하면 다음과 같은 결과가 발생한다는 것이 일반적으로 이해됩니다. 정의되지 않은 동작. 그러나 Null 포인터를 사용하여 정적 멤버에 액세스하려고 하면 놀라운 관찰이 발생합니다. 이 코드 샘플은 예상치 못한 동작을 보여줍니다.

<code class="cpp">struct demo
{
    static void fun() { std::cout << "fun() is called\n"; }
    static int a;
};

int demo::a = 9;

int main()
{
    demo* d = nullptr;
    d->fun();
    std::cout << d->a;
    return 0;
}</code>
로그인 후 복사

이 프로그램을 컴파일하고 실행하면 런타임 오류 없이 예상한 출력이 생성됩니다. 이는 질문을 제기합니다. 왜 null 포인터를 사용하여 정적 멤버에 액세스하는 것이 허용되는 반면 비정적 멤버는 정의되지 않은 동작을 보이는가?

표준 해석

인식된 모호함에도 불구하고 C 표준은 명시적으로 이 시나리오를 허용합니다. 동작은 다음 요인으로 인해 잘 정의되어 있습니다.

  • 폐기된 값 표현식:
    널 포인터 "d"를 통해 정적 멤버 "a"에 액세스할 때, 표현식 *d는 폐기된 값 표현식으로 간주됩니다. 이는 표현식이 평가되지만 해당 값이 삭제되고 계산이나 할당에 사용되지 않음을 의미합니다.
  • ID 수정 불가:
    널 포인터를 통한 간접 시도는 시도되지 않습니다. 개체의 ID를 수정합니다. 특정 객체 인스턴스와 독립적인 정적 멤버의 경우 해당 ID는 널 포인터의 영향을 받지 않습니다.

정의되지 않은 동작의 의미

C 표준에서는 널 포인터를 사용하여 정적 멤버에 액세스하는 것을 허용하지만 이 방식은 권장되지 않는다는 점에 유의해야 합니다. 다음과 같은 이유로 여전히 의심스러운 접근 방식입니다.

  • 구현 세부 사항에 대한 의존:
    정적 멤버 액세스에 널 포인터를 사용하는 동작은 다양한 구현에서 보장되지 않습니다. 일부 컴파일러는 경고나 오류를 표시할 수 있지만 다른 컴파일러는 문제 없이 이를 허용할 수 있습니다. 이러한 구현별 동작에 의존하면 이식성 문제가 발생할 수 있습니다.
  • 혼란 및 오류:
    널 포인터를 통해 정적 멤버에 대한 액세스를 허용하면 코드 유지 관리 시 혼란과 잠재적인 오류가 발생할 수 있습니다. 디버깅과 오류 원인 식별이 더욱 어려워질 수 있습니다.

대체 모범 사례:

널 포인터를 통해 정적 멤버에 액세스하는 대신 더 나은 방법입니다. 클래스 이름을 직접 사용합니다. 이를 통해 정의되지 않은 동작의 위험 없이 클래스 수준 속성 및 함수에 대한 명확하고 일관된 액세스가 보장됩니다.

<code class="cpp">// Use the class name directly to access static members
int main()
{
    demo::fun();
    std::cout << demo::a;
    return 0;
}</code>
로그인 후 복사

이러한 모범 사례를 준수하고 정적 멤버 액세스에 널 포인터 사용을 피함으로써 개발자는 다음과 같이 작성할 수 있습니다. 안전하고 믿을 수 있는 C코드입니다.

위 내용은 C에서 널 포인터를 사용하여 정적 멤버에 액세스하는 것이 허용되는 반면 비정적 멤버에 액세스하면 정의되지 않은 동작이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿