배열 경계를 넘어 배열 구독 지점을 배열할 수 있습니까?
다음 코드가 C 표준을 준수하는지 여부에 대한 의문이 생깁니다.
int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
로그인 후 복사
구체적으로 이 맥락에서 &array[5]의 유효성은 다음과 같습니다.
C 표준
C99 초안 표준에 따름:
-
§6.5.2.1, 단락 2: "E1[E2]는 (*((E1)과 동일합니다. (E2)))"
-
§6.5.3.2, 단락 3(강조): "피연산자가 [] 연산자의 결과인 경우 & 연산자도 단항 *도 아닙니다. []가 암시하는 것은 평가되고 결과는 마치 & 연산자가 제거되고 [] 연산자가 a로 변경된 것과 같습니다. 연산자."
-
§6.5.6, 단락 8: "식 P가 배열 객체의 마지막 요소 하나 다음을 가리키는 경우, 식 (P) 1은 마지막 요소의 하나 다음을 가리킵니다. 배열 객체의 요소이고 표현식 Q가 배열 객체의 마지막 요소 하나 다음을 가리키는 경우 표현식 (Q) - 1은 배열의 마지막 요소를 가리킵니다. object."
결론
이러한 조항은 다음을 나타냅니다.
- 포인터는 합법적으로 개체의 끝을 지나 한 요소를 가리킬 수 있습니다. 배열(역참조되지 않음).
- &array[5]는 다음과 같습니다. &*(배열 5)는 (배열 5)와 동일합니다.
- (배열 5)는 배열 끝을 지나서 하나를 가리킵니다.
- &array[5]는 그렇지 않기 때문입니다. 역참조가 발생하면 C 표준에 따라 합법적입니다.
위 내용은 `&array[5]`는 배열 경계를 넘어서는 C의 유효한 포인터입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!