2016-10-19 2 views
2

스택에 하나와 힙에 두 개의 배열을 선언하면 변수 이름을 인쇄 할 때 다른 동작이 발생합니다 (gdb의 경우 중요).배열의 변수 이름이 스택에 선언되지 않은 이유는 무엇입니까? C++?

int array_on_stack[5]; 

int * array_on_heap = new int[5]; 

이제 gdb에서 각 코드 행을 단계별로 실행 한 다음 변수 이름을 인쇄하여 각각에 대한 메모리 주소를 얻습니다.

print array_on_stack 

print array_on_heap 

하지만 array_on_stack 것은 상기 어레이의 컨텐츠가 아닌 메모리 어드레스를 출력한다. 메모리 주소를 얻으려면 명령이 필요합니다 print &array_on_stack. 이는 array_on_stack이 포인터가 아님을 나타냅니다. 이 두 선언의 차이점을 메모리 주소에 액세스하는 방법과 이유가 무엇인지 설명 할 수 있습니까?

+0

위해 GDB에서 비슷한 결과를 얻을 것이다, 하나는 배열 포인터, 그리고 사람; 그들은 다른 것들입니다. – UKMonkey

+2

* 이는 array_on_stack이 포인터가 아님을 나타냅니다. * 올바른 것입니다. 배열은 포인터가 아닙니다. 포인터는 포인터이고 배열은 배열입니다. 'int'와 마찬가지로'double'도 아닙니다. – NathanOliver

답변

5

array_on_heap은 배열이 아닙니다. 동적 할당 배열의 첫 번째 항목에 대한 포인터입니다.

배열은 배열이고 포인터는 포인터입니다.

은 그러므로 당신은 그들이 동일하지이기 때문이다

int* array_with_automatic_storage = &array_on_stack[0]; 
+0

나는 C++ 배열에서 변수 이름이 단순히 첫 번째 객체를 가리키는 포인터가되도록 포인터에 성능 저하가 있다고 생각했다. 그래서 우리는 두 가지 방법으로 배열을 선언 할 수 있습니다. – xjtc55

+0

@ xjtc55 : 네, 위의 선언에서 포인터 배열,/decay/to 포인터 타입으로 암시 적 변환을 이용하여'array_on_stack'을'array_on_stack [0]'으로 대체 할 수 있습니다. 그러나 배열 표현식은 항상 부패하지 않으며 배열은 포인터가 아닙니다. 특히 배열 변수에 포인터를 할당 할 수 없습니다. –

+2

[C++ 배열 FAQ] (http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c) 질문은 여기에 있으며, 대부분 Fred Overflow와 저에게 씁니다. 그것을 읽는 것보다 더 나쁠 수 있습니다. 또한 [C++ 배열 설명서] (http://stackoverflow.com/documentation/c%2b%2b/3017/arrays#t=201610191331403254374)가 여기에 있으며, 저에게 주로 작성되었습니다. 필자는 저자를 공통 공개로 언급합니다. –