>  기사  >  백엔드 개발  >  ## 유효하지 않은 포인터를 저장하는 것은 C/C에서 항상 정의되지 않은 동작입니까?

## 유효하지 않은 포인터를 저장하는 것은 C/C에서 항상 정의되지 않은 동작입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-26 02:34:27848검색

## Is Storing an Invalid Pointer Always Undefined Behavior in C/C  ?

잘못된 포인터를 저장하면 항상 정의되지 않은 동작이 발생합니까?

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

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