2012-07-12 3 views
3

친구들 나는 포인터 프로그램으로 놀고 있었고 GCC (그리고 아마도 C 표준)가 정적 및 동적 배열을 구별한다는 것을 깨달았습니다.정적 배열과 동적 배열의 차이

동적 배열에는 배열의 요소 주소에 대한 자리 표시자가 있지만 정적 배열의 경우 컴파일러에서 요소 배열의 시작 주소를 저장하는 메모리 위치가 없습니다.

나는 혼란을 보여주는 예제 프로그램을 가지고 있습니다. 위의 프로그램에 대한

#include <iostream> 
#int main(void) 
{ 
    int _static[10]; 
    int *_dynamic; 

    _dynamic = new int [10]; 

    std::cout<<"_static="<<_static<<" &_static="<<&_static<<" &_static[0]="<<&_static[0]<<std::endl; 
    std::cout<<"_dynamic="<<_dynamic<<" &_dynamic="<<&_dynamic<<" &_dynamic[0]="<<&_dynamic[0]<<std::endl; 

    return 0; 
} 

, _static과 기대 라인에서 같은 주소를 반환 &_static[0]. 그러나 &_static도 다른 두 주소와 동일한 주소를 반환합니다.

따라서 _static&_static은 같은 번호 (또는 주소)를 의미합니다. 예상대로, _dynamic&_dynamic은 다른 위치를 나타냅니다.

그래서 C 표준에서 _static&_static은 같은 위치를 참조해야한다고 말한 이유는 무엇입니까? 혼란스러워 보입니다. 내가 느끼는 한 가지 이유는 &_static은별로 의미가 없다는 것입니다. 그렇다면 사용 대신 오류로보고하지 않아야합니까?

누군가이 혼란을 도와 줄 수 있습니까?

+2

포인터로 배열 ** 붕괴 ** 때문에. '_static'은 출력을위한 첫 번째 요소에 대한 포인터로 붕괴합니다.'char *'(문자열을 출력하는 곳)처럼'int *'에 과부하가 없기 때문에'int *' 대신 사용됩니다. 그러므로'_static'은 첫 번째 요소 나'& _static [0]'에 대한 포인터의 값을 출력합니다. – chris

+1

이 게시물에 관심이있을 수 있습니다 http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c 여기서 모든 정보를 배울 수 있습니다. –

+2

힉스 보손 (Higgs bosons)이 부식되면서 배출 되는가? –

답변

4

실제로 _static&_static은 같은 위치를 참조하지 않습니다. 포인터가 쇠퇴 한 상황에서 _static을 사용하기 때문에 나타나는 유일한 이유입니다. 즉, 사용하는 방법에 따라 같은 위치를 나타냅니다. 그러나 당신이 그것을하기 전에 그들은 하나의 배열이었고 다른 하나는 포인터였습니다. 그들은 근본적으로 다른 것들이기 때문에 같은 수 없습니다.

+0

"포인터로 쇠퇴하는"이라는 용어는 나에게는 약간 외계인 같다. 정교하게 주시겠습니까? –

+1

"감쇠"라는 용어는 배열이 첫 번째 요소에 대한 포인터가되어 프로세스에서 크기 정보를 잃는 방식을 나타냅니다. 이것이'sizeof (_static)'와'sizeof (& _ static)'가 다른 이유입니다. 배열은'sizeof'와 함께 사용될 때 감쇠하지 않지만 예제 코드에서와 같이'operator <<'에 전달 될 때 감쇠합니다. –

9

함수 내부의 정적 배열이 스택에 할당됩니다. 이 방법은 _static (첫 번째 항목에 대한 포인터로 감쇠 됨), &_static[0]&_static은 동일한 값, 동일한 메모리 주소를가집니다.

한편, 동적 배열은 실제로 연속 메모리 영역에 대한 포인터입니다. 포인터 만 스택에 저장됩니다. 따라서 &_dynamic (스택에서)과 _dynamic (힙에서)이 다릅니다. 이 이미지는 모든 것을 보여줍니다

희망 :

static vs dynamic arrays

는이 article about static and dynamic global arrays에서 보라는 the distinction between extern and non-extern 계속.

+0

+1 사진을 위해, 그것은 정말로 멋지다! – huon

0

간단히 말하면 정적은 스택에 만들어지고 동적은 힙에 만들어집니다. 정적 배열에서는 프로그램을 실행하기 전에 크기를 말해야하지만 동적으로 사용자의 입력을 받아서 그 크기의 배열을 만들 수 있습니다.정적

예 : 동적

int array[5]; 

예 :

int *array; 
cout << "Enter size of array: "; 
cin >> size; 
array = new int[size];