2011-09-20 4 views
2

에 대한 내 variablle 선언 : 나는 대신에 오류가 발생하거나 num 여러 번 선언 만하는 중 하나를 기대했던나는 다음과 같은 C 코드를 시도했다 루프

void main() 
{ 
    int i; 
    for(i = 0; i< 10; i++) 
    { 
     int num; 
     printf("\nthe variable address is: %p", &num); 

    } 
    getch(); 
} 

, 출력은 &num에 대해 동일한 값을 보여줍니다 for 루프의 모든 반복에 대해. 이 문제의 원인은 무엇입니까? for 루프에서 선언을하는 것과 관계없이 실제 선언/정의는 한 번 발생합니다.

누군가가 나를 어떻게 이해할 수 있습니까?

답변

3

이 비교 :

int i; 
    int val = 0; 
    for(i = 0; i< 5; i++) 
    { 
     int num = val++; 
     printf("\nthe variable address is: %p", &num); 
     printf("\nthe value is: %d", num); 
    } 

이 다시 num 항상 같은 주소가 있는지 보여줍니다뿐만 아니라 별개의 가치가 반복 될 때마다 초기화된다.

스택과 관련된 아이디어는 레이아웃이 컴파일 타임에 정의된다는 것입니다. 각 스택 변수는 스택 프레임이있는 스택의 주소에 매핑됩니다.

또 다른 문제는 각 반복에서 새 변수가 "할당 된"경우 작은 기계가 대형 루프를 어떻게 처리합니까?

참조 : Call Stack

7

스택 할당 변수의 주소를 인쇄하고 있습니다. 변수의 범위는 for 루프입니다. 이론적으로 변수는 라인 int num;에서 생성되고 브래킷 닫기시 메모리가 해제됩니다. 메모리 레이아웃은 컴파일러에 따라 달라집니다.

컴파일러가 메모리를 재사용 할 수 있다는 것을 아는만큼 똑똑 할 수도 있고, 가변 메모리를 위해 컴파일러에서 메모리를 자유롭게 선택할 수도 있습니다.

또한 옵티마이 저가 컴파일러에게 num을 다시 사용할 수 있다고 알릴 수도 있습니다.

컴파일러는 모두 동일한 주소를 가지고 있기 때문에 한 번만 선언/정의된다는 것을 의미하지는 않습니다. 이 설명을 돕기 위하여

관련 문제