여기서는 무슨 일이 일어나고 있는지 정확하게 해석하고 싶습니다. 32 비트 환경에서 컴파일되고 스택에 선언 된 다음 코드 스 니펫을 고려하십시오.포인터 포인터가 같은 포인터 (배열 첨자가 정수가 아님)
// Declares an array of integers with a length of 10.
int arr[ 10 ] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// Performs some pointer arithmetic.
int result = arr[ arr + 2 ];
이제 C에서 대괄호를 사용하는 것은 다음에 대한 별칭 일뿐입니다.
*(...)
이렇게 별칭을 지정하면 스 니펫이 다음과 같이 변환됩니다.
int result = *(arr + arr + 2);
지금, 나의 해석은 포인터 연산이 편곡의 주소를 더한 정수의 크기를 곱한 2, 플러스 편곡의 주소로 평가하는 것입니다. 따라서, 결론은 arr이 할당하지 않은 메모리를 가리킨다는 것입니다. 결과는 약간의 가비지 값이됩니다.
그러나 clang과 gcc로 컴파일 할 때 "배열 첨자가 정수가 아닙니다."라는 오류 메시지가 나타납니다. 왜 이런 경우이고 내 해석은 어디에서 잘못 되었습니까?
할 수 있습니다하지 인덱스 포인터와 배열. –
크기 10의 배열에는 11 개의 요소가 있습니다. – Undefined
(C가 표현식을 "평가"하는 방식과 유효한 구문을 고려한 것은 서로 다른 두 가지입니다.) –