잘못된 포인터 저장
잘못된 포인터를 역참조하면 정의되지 않은 동작이 발생한다는 것은 잘 알려져 있지만 덜 명확한 질문이 발생합니다. 포인터 변수 자체에 잘못된 메모리 주소를 저장하는 행위는 정의되지 않은 동작인가요?
다음 코드 조각을 고려하세요.
<code class="c++">const char* str = "abcdef"; const char* begin = str; if (begin - 1 < str) { /* ... do something ... */ }</code>
이 예에서 표현식 begin - 1은 잘못된 메모리 주소입니다. 그러나 주소는 명시적으로 역참조되지 않고 유효성을 확인하기 위해 포인터 연산에 사용됩니다.
이 시나리오는 정의되지 않은 동작으로 간주됩니까?
직관적으로 일부에서는 다음과 같이 주장할 수 있습니다. 포인터 산술은 종종 그러한 연산에 달려 있기 때문에 그렇지 않습니다. 또한 포인터는 본질적으로 정수입니다. 그러나 유효하지 않은 포인터를 레지스터에 저장하는 단순한 행위조차도 잠재적인 구조적 영향(예: 버스 오류)으로 인해 정의되지 않은 동작이 될 수 있다고 주장되어 왔습니다.
이 문제를 명확히 하기 위해 관련 C 또는 C 표준. 불행하게도 이 문제는 누락으로 인해 해결되지 않은 채 남아 있습니다. C Draft Standard의 섹션 6.5.6/8에서는 포인터가 배열 요소를 가리키고 배열이 충분히 크거나 피연산자가 마지막 배열 요소 하나를 지나갈 때 포인터 연산의 의미를 설명합니다. 위에서 설명한 상황에서의 동작은 이러한 특정 사례에 속하지 않습니다. 따라서 잘못된 포인터를 저장하는 것은 정의되지 않은 동작을 생략하는 것입니다.
위 내용은 잘못된 포인터 주소를 저장하면 정의되지 않은 동작이 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!