2016-06-11 3 views
-1

은이 같은 일부 코드가있다.어레이 어드레스 ++

그런 다음이 입력으로 tmp[] 길이가 0이되었음을 깨달았습니다. 그래서와 array[]tmp[]의 주소 인쇄 :

printf("%d\n %d\n", array, tmp); 

을하고이 같은 주소를했다 발견했다.

배열의 길이가 0 인 경우 어떤 일이 발생할지 파악하고 싶습니다.

array[]: 1363909056 
tmp[] : 1363909052 

그것은 (입력 부분을 제외하고) 바로 앞의 코드처럼 보이는 :

int array[1]; 
array[0] = 10; 

int tmp[0]; 
tmp[0] = 1; 

주소 : 그래서 나는이 시도. 그러나 tmp[0]array[0]은 다른 값과 주소를 갖습니다.

그리고 나는 tmp에 더 작은 주소 (array)가 있다는 것을 정말로 알고 있습니다.

그래서 제 질문은 : 나는 길이 제로의 배열을 선언하는 경우

  1. 어떻게됩니까?
  2. 왜이 두 코드가 다른 방식으로 작동합니까? (그들은 나에게도 똑같아 보인다 :))
+5

'int array [n];'은 표준 C++가 아닙니다. –

+0

다른 '선언문'으로 많은 시도를했지만 더 혼란 스럽습니다. – mzhty

+3

'tmp [0] = 1;'은 단순히 정의되지 않은 동작을 호출합니다. 결과적으로'tmp [0]'에서 접근 한 결과에 대해서는별로 가치가 없습니다. –

답변

0

이것을 "정의되지 않은 동작"이라고합니다. 귀하의 경우, 발생

int tmp[0]; 

다음 일을 선언 한 것입니다 : tmp[0] 이후

tmp[0]=1; 

이 존재하지 않는,이 정의되지 않은 동작입니다. 문제는 배열이 크기 0으로 선언 된 것이 아니라 (자체 장점에 부합하지는 않지만 여기서는 문제가 아닙니다) 배열의 끝을 지나서 메모리를 덮어 쓰는 결과로 정의되지 않은 동작입니다.

+0

* 정당하지 않은 사람 *은 부적절한 말을하는 좋은 방법입니다. :) – SergeyA