2012-05-24 5 views
0

난 그냥 코드가 깨지거나하지 않을 여부를 확인하기 위해 C에서 다음 코드를 썼다. 다차원 배열 : int A [5][2][3]을 선언 할 때 개념적으로 첫 번째 수준의 A는 5 개의 요소 (0 - 4)의 1 차원 배열이고 해당 배열의 모든 요소는 그 자체로 1 차원 배열 2 요소 및 그 배열의 모든 요소는 3 요소의 1 차원 배열입니까? 그 개념이 정확하다면, A[6][0][0]도 존재할 수 있습니다 - 첫 번째 단계에는 5 개의 요소 (0 기반) 만 있기 때문에.다차원 배열과 주소

도움이 되었다면 크게 감사하겠습니다.

답변

5

배열 외부의 위치에 액세스 중이므로 A[6]이 없습니다. 그건 정의되지 않은 행동이고, 어떤 것도 일어날 수 있습니다.

A[5]은 잘 정의 된 위치 (배열 끝을 지나서)이므로 포인터를 가져 오는 것은 합법적이지만 포인터에 액세스하려고하는 것은 아닙니다. 그러나 A[6] 또는 다른 큰 색인에 대한 포인터를 얻는 것은 완전히 정의되지 않습니다.

+0

그래서 정수 주소를 제공하는 대신 끊어서는 안됩니다. 그 정수 주소 란 무엇입니까? 선언 된 배열에있는 요소의 주소를 나타내지 않는 임의의 숫자입니까? –

+0

@ John Nash : 아니, 깨질 수는 있지만 꼭 할 필요는 없습니다. 정의되지 않은 동작이 발생하면 아무 일도 일어나지 않을 것이므로 표준 단어라고 말합니다. 전체 프로그램은 ASCI 아트를 인쇄하는 것과 같이 완전히 다른 것을 결정할 수 있으며 여전히 합법적입니다. –

+0

@ John Nash : A [5]는 ** 임의의 주소가 아니며 메모리에 잘 정의 된 장소입니다 :'* (A + 5)'. 그것은 선언 된 배열을 지나서 메모리의 다음 위치입니다. – pb2q

0

C는 배열 경계 검사를 수행하지 않습니다. int A[4]의 경우 A[5]을 포인터 계산과 같이 생각하십시오. *(A + 5).

A이 5 개 요소 (0-4)로만 선언 된 경우에도 C는 A을 사용하여 배열의 선언 된 경계 외부에서 메모리를 참조 할 수있게합니다.

이 액세스의 결과는 정의되지 않습니다. A[5]을 읽으면 쓰레기가 생길 수 있습니다. A[5] (즉 A[5] = 13)을 쓰면 다른 할당 된 메모리 블록이 손상 될 수 있습니다.

wiki article은 이것을 이해하기에 꽤 좋은 시작이지만, K&R 사본을 받아 읽어보고 모든 연습을하는 것이 좋습니다.