2012-04-20 2 views
8

0 요소가 할당되지 않은 포인터와 같은 배열입니까?0 요소가있는 배열

int arr[0];int* arr;과 동일합니까?

편집 : 나는이 비슷한 짓하면 어떻게 :

int x[0]; 
int* const arr = x; 

를이 코드를 시도하고 컴파일. 내 지식으로는 x와 arr 모두 메모리의 동일한 위치를 가리켜 야합니다. 이 경우 차이점은 무엇입니까?

+1

포인터는 항상 새로운 것을 가리킬 수 있지만 배열은 정적으로 정의됩니다. – chrisaycock

답변

13

전혀 아님.

arr [0]의 경우 arr에는 잘 정의 된 주소가 있습니다.

* arr의 경우 으로 초기화되지 않습니다.

방금 ​​전에 정의 배열을 ARR CONST를 초기화하여 편집, 후 : 그냥 변수의 내용에 차이가 없을 것이다, 그러나 행동에 당신은 그들에 수행 할 수 것 .

+0

int * const arr은 어떨까요? – Dasaru

+0

@ 다사리 당신이 그것을 시도 했습니까? 그건 컴파일되지 않습니다 ... –

+0

@Dasaru : 일반적으로 할 수 있습니다 ...하지만 const로 주어진 메모리 위치에 ** arr **을 수동으로 초기화해야합니다. http://stackoverflow.com/questions/355258/why-must-const-members-be-intialized-in-the-constructor-initializer-rather-than –

0

길이가 0 인 배열은 특정 주소, 즉 배열의 시작을 가리 킵니다. 배열이 끝나면 정의되지 않은 데이터 (이 경우에는 가리키는 주소)가 생깁니다. 이 유용

int arr[0]; 
int* ptr; 

// arr is a reliable value; 
// *arr is not; 
// ptr is not; 

한 가지 방법 : http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html

+0

범위 밖의 배열 액세스가 UB 일 뿐이므로이 사용법이 실제로 표준에 따라 합법적인지 여부에 대한 합의가 없습니다. 소프트웨어에서 버그가 발생하지만, 이것은 단순한 가설이 아닙니다.) –

+0

@ KonradRudolph C90에서 'int arr [0]'은 구조를 포함하여 불법입니다. 그리고 만약 배열이'int arr [1];'이라고 선언되고, 당신이 인덱스 2로 접근했다면 그것은 정의되지 않은 행동 이었음이 분명합니다. C99은 아니지만 C++이 아니라면 struct의 마지막 멤버를 int arr [];로 선언하여이 사용법을 지원할 수 있습니다 (단,'int arr [0];은 에러로 남습니다). –

+0

@James 아, 그게 다야. C++은 어떨까요? 바깥 배열 접근이 결코 합법적이지 않다는 것을 확신합니다. 맞습니까? –

4

A는 로컬이 할당되지 않은 포인터와 동일하지 그래서 길이 제로의 배열은 C++에서 불법 선언했다.

관련 문제