NULL 포인터에서 클래스 멤버에 액세스
Foo 유형의 인스턴스에 대한 포인터로 선언되었음에도 불구하고 foo 변수는 다음으로 초기화됩니다. 0, 널 포인터로 만듭니다. 널 포인터의 멤버에 액세스하는 것은 일반적으로 정의되지 않은 동작이므로 이는 직관에 어긋나는 것처럼 보일 수 있습니다. 그러나 특정 상황에서는 이러한 동작이 허용됩니다.
비가상 메소드 호출
가상 메소드가 아닌 say_hi()는 널 포인터에도 불구하고 성공적으로 호출됩니다. 가상 방법. 가상 메서드에는 개체 유형에 따라 호출할 함수를 결정하기 위해 유효한 개체가 필요합니다. 반면 비가상 메서드에는 컴파일러가 직접 함수 호출 명령을 생성하는 데 사용하는 미리 결정된 함수 주소가 있습니다.
구체적으로 컴파일러는 다음과 동일한 코드를 생성합니다.
void Foo_say_hi(Foo* this); Foo_say_hi(foo);
say_hi() 함수는 this 포인터를 참조하지 않으므로 잠재적인 null을 역참조할 필요가 없습니다. 포인터.
객체 할당
foo 변수는 메인 함수 내의 지역 변수이므로 함수의 스택에 할당됩니다. 포인터 변수로서 그것이 가리키는 실제 객체는 여기에 할당되지 않습니다. null 값은 포인터가 유효한 개체를 참조하지 않음을 나타냅니다.
위 내용은 NULL 포인터에서 가상이 아닌 메서드를 호출해도 정의되지 않은 동작이 발생하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!