> 백엔드 개발 > C++ > C 배열의 끝을 한 번 지나서 주소를 사용하는 것이 합법적인가요?

C 배열의 끝을 한 번 지나서 주소를 사용하는 것이 합법적인가요?

Susan Sarandon
풀어 주다: 2024-12-26 07:18:45
원래의
399명이 탐색했습니다.

Is Taking the Address One Past the End of a C   Array Legal?

배열 요소의 주소를 C 표준에서 허용하는 끝을 한 단계 넘어서고 있습니까?

아래 코드 조각은 다음에 대한 논의를 불러일으켰습니다. C 표준에 따른 유효성:

int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
로그인 후 복사

구체적으로는 &array[5] 이 문맥에서 적법한 C 표현은 무엇입니까?

C 표준에 따른 적법성

C 표준에서는 이 표현의 적법성을 다음과 같이 정의합니다.

  • C 17 표준 6.5.2.1, 단락 2: E1[E2]를 (*((E1) (E2)))와 동일하게 정의합니다.
  • C 17 표준 6.5.3.2, 단락 3: [] 표현식에 대해 다음과 같이 명시합니다. & 연산자와 묵시적인 *는 평가되지 않으므로 &(E1 E2)가 됩니다.
  • C 17 표준 6.5.6, 단락 8: 포인터가 배열 끝을 지나 한 요소를 가리키는 것을 허용하지만 역참조는 금지합니다.

해석

이러한 규칙을 &array[5]에 적용하면 have:

&array[5] = &*(array + 5) = (array + 5)
로그인 후 복사

(배열 5)는 배열의 끝을 지나 1을 가리키고 역참조되지 않으므로 C 표준에 따른 합법적인 표현입니다.

C 표준과의 비교

이 동작은 C 표준과도 일치합니다. 표준은 역참조되지 않는 한 배열 끝 너머의 요소 주소를 가져올 수 있도록 허용합니다.

다른 처리 이유

처리 결정 array 5와 &array[4] 1은 다음 표현식의 서로 다른 목적에 뿌리를 두고 있습니다.

  • array 5는 배열의 끝을 지나는 포인터를 제공하여 배열의 경계를 넘어 비교하고 탐색할 수 있도록 합니다.
  • &array[4] 1은 존재하지 않는 요소에 대한 참조를 생성하려고 시도하므로 정의되지 않은 동작이 발생합니다.

위 내용은 C 배열의 끝을 한 번 지나서 주소를 사용하는 것이 합법적인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿