>백엔드 개발 >C++ >C에서 배열 요소의 주소를 끝에서 한 번 더 가져오는 것이 합법적인가요?

C에서 배열 요소의 주소를 끝에서 한 번 더 가져오는 것이 합법적인가요?

Linda Hamilton
Linda Hamilton원래의
2024-12-18 01:40:10468검색

Is it Legal in C   to Take the Address of an Array Element One Past the End?

배열 요소의 주소를 끝에서 한 번 더 가져올 수 있습니까?

다음 코드는 프로그래밍에서 논쟁의 대상이 되어 왔습니다. 커뮤니티:

int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];

구체적으로 &array[5]가 이 맥락에서 적법한 C 코드인지 여부에 대한 질문입니다.

C 표준의 입장

C 표준에 따르면 구체적으로 다음과 같습니다.

  • §6.5.2.1 : 첨자 지정(E1[E2])은 다음과 같습니다. *((E1) (E2)).
  • §6.5.3.2: [] 연산자로 인한 표현식의 주소를 가져오는 것은 []를 바꾸는 것과 같습니다. .

에 대한 의미 &array[5]

이 규칙을 &array[5]에 적용하면 다음과 같습니다.

  • &array[5]는 &array[0] 5와 동일합니다.
  • &array[0] 5 포인트 끝에서 한 요소 지나 array.

합법인가요?

예, 합법입니다. 표준에서는 포인터가 역참조되지 않는 한 배열의 끝을 지나 한 요소를 가리키는 포인터를 명시적으로 허용합니다. 이 경우 &array[5]는 주소를 얻는 데만 사용되며 해당 주소의 값에 액세스하는 데 사용되지 않으므로 표준에서 허용하는 범위 내에 있습니다.

왜 차이점이 있습니까? 배열 5 또는 &array[4] 1?

&array[5]의 동작은 배열 5 또는 &array[4] 1과 다릅니다. []가 암시하는 단항 * 연산자의 동작과 결합된 및 [] 연산자의 우선 순위로 인해 발생합니다. 구체적으로:

  • 배열 5는 *(배열 5)로 평가됩니다. 이는 배열의 끝을 지나 포인터를 가리키는 포인터를 역참조하려고 시도하며 이는 정의되지 않은 동작입니다.
  • &array[4 ] 1은 &*(array 4) 1로 평가되며 이는 배열 5와 동일하므로 배열의 끝을 지나 포인터를 가리키는 포인터를 역참조하려고 시도합니다. array.

반대로 &array[5]는 & 연산자가 제거되고 [] 연산자가 연산자로 변경되어 배열 5가 되는 것처럼 평가되지만 단항 연산자는 평가되지 않습니다. * 연산자.

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

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