>  기사  >  백엔드 개발  >  C에서 널 포인터를 통해 메소드를 호출하는 것이 때때로 작동하는 이유는 무엇입니까?

C에서 널 포인터를 통해 메소드를 호출하는 것이 때때로 작동하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-01 02:27:27923검색
Why Does Invoking a Method Through a Null Pointer in C   Sometimes Work? 
이 문제를 자세히 알아보려면 다음 예를 고려하세요.

이 스니펫에서는 클래스 테스트가 정의됩니다. 생성자와 show() 메소드를 사용합니다. main() 함수에서는 포인터 ptr이 NULL로 초기화된 후 ptr을 통해 show() 메서드가 호출됩니다.

놀랍게도 프로그램은 오류 없이 실행되고 생성자를 트리거하지 않고 "show fun Called"를 인쇄합니다. . 이는 C에서 컴파일러가 널 포인터의 유형을 알고 있어 메소드의 코드를 식별할 수 있기 때문입니다. show() 메소드는 this 포인터를 활용하지 않기 때문에 성공적으로 실행됩니다.

그러나 이 동작은 C 표준에서 정의되지 않은 것으로 간주됩니다. 컴파일러는 메서드를 호출하기 전에 포인터가 NULL인지 확인하지 않음으로써 코드를 최적화할 수 있습니다. 이러한 최적화는 효율성을 향상시키지만 안전성과 예측 가능성을 저하시킵니다.
<code class="cpp">#include <iostream>
using namespace std;

class test
{
    int i;
public:
    test():i(0){ cout << "ctor called" << endl;}
    void show()
    {
        cout << "show fun called" << endl;
    }
};

int main(int argc , char *argv[])
{
    test *ptr = NULL;
    ptr->show();
    return 0;
}</code>

위 내용은 C에서 널 포인터를 통해 메소드를 호출하는 것이 때때로 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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