>백엔드 개발 >C++ >C 정의되지 않은 동작에서 초기화되지 않은 포인터를 역참조하고 있습니까?

C 정의되지 않은 동작에서 초기화되지 않은 포인터를 역참조하고 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-14 14:52:16612검색

Is Dereferencing an Uninitialized Pointer in C   Undefined Behavior?

정의되지 않은 동작: C에서 초기화되지 않은 포인터 역참조

C에서 흔히 혼동되는 점은 초기화되지 않은 포인터를 역참조하는 것이 정의되지 않은 동작(UB)을 구성한다는 점을 이해하는 것입니다. C 표준에는 수많은 규칙이 포함되어 있지만 이 동작을 정의하는 정확한 조항을 찾는 것이 어려울 수 있습니다.

문제의 코드 조각:

int* ptr;
*ptr = 0;

ptr 역참조 여부에 대한 질문을 제기합니다. UB로 이어집니다. 이를 명확히 하기 위해 C 표준의 관련 섹션을 자세히 살펴보겠습니다.

표준 조항

표준의 섹션 4.1은 중요한 통찰력을 제공합니다.

"lvalue가 참조하는 개체가 T 유형의 개체가 아니고 T에서 파생된 유형의 개체가 아니거나 개체가 초기화되지 않은 경우 이를 필요로 하는 프로그램 변환에 정의되지 않은 동작이 있습니다."

우리의 경우 ptr은 정수에 대한 초기화되지 않은 포인터입니다. 따라서 초기화하지 않고 역참조하려는 시도는 먼저 섹션 4.1에 설명된 조건에 해당하고 UB가 발생합니다.

UB와 관련하여 자주 인용되는 섹션 3.7.3.2/4는 코드에 직접 적용되지 않습니다. null이 아닌 포인터에서 할당 해제 기능을 사용하는 것과 관련된 문제의 스니펫입니다.

추가 리소스

표준에서 "uninitial"을 검색하면 8.5.1과 같은 다른 관련 섹션이 표시될 수 있으며, 이는 초기화되지 않은 개체에 액세스하기 위한 규칙을 더욱 명확하게 합니다.

위 내용은 C 정의되지 않은 동작에서 초기화되지 않은 포인터를 역참조하고 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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