2013-05-15 2 views
4

나는 정적 로컬 변수의 개념을 가지고있다 : 글로벌 수명, 로컬 범위. 마찬가지로, 자동 변수은 프로그램 흐름이 변수의 컨텍스트를 입력하고 떠날 때 자동으로 할당/할당 취소된다는 것을 이해합니다. 이와 같이자동 변수가 초기화되지 않은 경우 정적 수명이 있습니까?

#include <stdio.h> 

void test_var(void){ 
    static unsigned foo = 0; 
    unsigned bar = 0; 
    printf(" %u %u\n", foo++, bar++); 
} 

int main(void){ 
    printf("Foo Bar\n"); 
    printf("--- ---\n"); 
    for(unsigned x = 0; x < 10; x++){ 
     test_var(); 
    } 

    return 0; 
} 

은, 앞의 예는 예상대로 동작하며 다음과 같은 출력 인쇄 :

#include <stdio.h> 

void test_var(void){ 
    static unsigned foo; /* not initialized */ 
    unsigned bar;   /* not initialized */ 
    printf(" %u %u\n", foo++, bar++); 
} 

int main(void){ 
    printf("Foo Bar\n"); 
    printf("--- ---\n"); 
    for(unsigned x = 0; x < 3; x++){ 
     test_var(); 
    } 

    return 0; 
} 

출력 :

Foo Bar 
--- --- 
0 0 
1 0 
2 0 
3 0 
4 0 
5 0 
6 0 
7 0 
8 0 
9 0 

은 무엇 나를 혼란스럽게하는 것은 초기화하지 않을 경우 변수가 작동하는 방법이다 :

Foo Bar 
--- --- 
0 2 
1 3 
2 4 
3 5 
4 6 
5 7 
6 8 
7 9 
8 10 
9 11 

정적 변수은 예상대로 동작합니다. 기본값은 0이고 함수 호출을 통해 유지됩니다. 자동 변수도 지속되는 것처럼 보입니다. 가비지 값을 보유하고 있지만 각 호출에서 증가합니다. 행동이 표준 C에서 정의되지 않은, 또는 이것을 설명 표준에 일련의 규칙이 있기 때문에

이 발생되어 있습니까?

+3

나에게 정의되지 않은 동작처럼 보입니다. test_var 함수 주위에 몇 가지 변수와 함수 호출을 추가하면 "재미"가 계속 발생할 것입니다. –

+3

정의되지 않은 동작입니다. 변수'bar'는 항상 같은 위치에 놓여지며 호출 사이에 결코 덮어 쓰지 않기 때문일 것입니다. –

+1

나는 거의 100 % 긍정적이다. 이것은 중복 된 질문이다. –

답변

1

C 표준은 개체의 수명이 저장소가 보장되는 시간이라고 말합니다 (예 : ISO/IEC 9899 : TC3의 6.2.4 참조). 정적 변수와 전역 변수의 수명은 프로그램 전반에 걸쳐 있으므로 위의 동작은 표준에 의해 보장됩니다. 이 값은 프로그램을 시작하기 전에 초기화됩니다. 자동의 경우에도 객체는 일정한 주소에 있지만 수명 만 보장됩니다. 따라서 막대가 여러 함수 호출에 대해 살아있는 것처럼 보일지라도이를 보장 할 수는 없습니다. 이것은 항상 변수를 초기화해야하기 때문에 사용하기 전에 어떤 변수가 같은 지점에 있었는지 알 수 없습니다. 이것은 내 컴퓨터에 다음과 같은 결과를 얻었다

#include <stdio.h> 

void test_var(void){ 
    static unsigned foo; /* not initialized */ 
    unsigned bar;   /* not initialized */ 
    printf(" %u %u\t%p\t %p\n", foo++, bar++, &foo, &bar); 

} 

int main() { 
    printf("Foo Bar\n"); 
    printf("--- ---\n"); 
    for(unsigned x = 0; x < 3; x++){ 
     test_var(); 
    } 

    return 0; 
} 

:

나는 약간 또한 정적 지역 변수 모두의 주소를 인쇄하는 프로그램을 적용

Foo Bar 
--- --- 
0 33616 0x1067c 0xbee894fc 
1 33617 0x1067c 0xbee894fc 
2 33618 0x1067c 0xbee894fc 

이 표시에 대한 나의 기계 모두 정적 foo과 자동 bar은 각각의 호출에 대해 각각의 동일한 주소에 있었지만 우연히 일치하고 있으며 C 표준은 항상 bar이 동일한 주소에 있다고 보장하지 않습니다 ress.

+0

정적 변수 값은 [프로그램 시작 전에 반드시 설정해야하는 것은 아닙니다.] (http://stackoverflow.com/questions/5567529/what-makes-a-static-variable-initialize-only-once), 처음에는 용도. –

+1

@Vilhelm Gray는 C++ 질문이며, 상황은 C++에서 다를 수 있습니다. – hetepeperfan

+0

죄송합니다. 너무 빨리 말을하고 간과 한 것입니다. –

관련 문제