잘못된 포인터를 저장하면 항상 정의되지 않은 동작이 발생합니까?
C 및 C에서 잘못된 포인터를 역참조하면 정의되지 않은 동작이 발생합니다. 그러나 질문이 생깁니다. 포인터 변수에 유효하지 않은 메모리 주소를 저장하는 것만으로도 정의되지 않은 동작이 되는 것일까요?
다음 코드를 고려하세요.
<code class="c">const char* str = "abcdef"; const char* begin = str; if (begin - 1 < str) { /* ... do something ... */ }</code>
여기서 표현식 시작 - 1은 다음과 같이 평가됩니다. 잘못된 메모리 주소입니다. 이를 역참조하는 것은 삼가지만 포인터 연산에 활용하여 유효성을 결정합니다. 그렇다면 특정 아키텍처가 유효하지 않은 포인터를 레지스터에 로드할 때 버스 오류를 유발할 수 있다는 점을 고려하면 이 작업에는 정의되지 않은 동작이 수반됩니까?
이 질문에 대한 답은 C 또는 C 표준에 있습니다. C Draft Standard에 따르면 유효하지 않은 포인터를 저장하는 것은 실제로 정의되지 않은 동작입니다. 표준의 섹션 6.5.6/8에서는 포인터 연산을 정의하지만 피연산자가 잘못된 메모리 주소를 가리키는 경우를 명시적으로 다루지 않습니다.
따라서 C 표준에서는 생략으로 인해 이 경우를 지정하지 않은 채로 둡니다. 정의되지 않은 동작으로 렌더링합니다. 결과적으로, 역참조되지 않더라도 유효하지 않은 포인터를 포인터 변수에 저장하는 것은 현재 표준에 따라 C와 C에서 정의되지 않은 동작으로 간주됩니다.
위 내용은 ## 유효하지 않은 포인터를 저장하는 것은 C/C에서 항상 정의되지 않은 동작입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!