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 중국어 웹사이트의 기타 관련 기사를 참조하세요!