2013-08-22 2 views
-3

전체 변수 실행을위한 정적 변수가 실제로 있습니까? 이 코드 스 니펫에는 아무런 의미가 없다는 것을 알고 있지만, If 문의 범위에 들어갈 때 때 c99 표준을 이해할 때 스스로에게 묻습니다. 즉, 객체를 역 참조하지 않은 것을 의미합니다. 그것의 일생. 운 좋게도 정적 객체가있을 주소를 역 참조하기 때문에 입니다. if statment가 진실 인 것처럼 이것은 정의되지 않은 행동이 아닐까요? 아니면 정적 인 객체의 수명이 첫 번째 모습에서 시작됩니까?프로그램 실행시 스태틱의 수명이 실제로 시작됩니까?

#define UTHOPICALMATCH (int *) 0xBCAA1400 
int *foo (void); 

int main(int argc, char** argv) 
{ 
    int * iPtr = UTHOPICALMATCH; 
    *iPtr = 5; 

    if (foo() == UTHOPICALMATCH) 
    { 
     printf ("It's still defined behavior!!!\r\n"); // is this true? 
     /*...*/ 
     return 0; 
    } 
    return -1; 
} 

int *foo (void) 
{ 
    static int si; 
    return &si; 
} 

편집 : 6.2.4-> 3 그것의 C99에서 상기 :

그 식별자 스토리지 클래스 지정자 정적 갖는 외부 또는 내부 링크 선언, 또는 개체 정적 저장 기간. 그것의 수명은 프로그램 전체의 실행이며 저장된 값은 프로그램 시작 전에 한 번만 초기화됩니다.

그래서 foo()를 호출 한 후 그 수명이 다가오고 있습니다. 내 자신에게 묻습니다. foo()가 호출되기 전에 유효하다는 것을 의미합니까?

+0

이미 실용적인 의미가없는 예제 코드 일뿐입니다. – dhein

+0

코드에서 볼 수있는 역 참조는'* iPtr'뿐입니다. 이것은'if' 문 앞에 있습니다. –

+0

@Jens Gustedt 맞아요. 주소가 siPtr과 같으면 내 자신에게 묻습니다. 여전히 정의 된 행동입니까? – dhein

답변

1

나는 당신이 묻는 것에 관해서 정말로 혼란 스럽다.

static int * siPtr; 
return siPtr; 

siPtrstatic이기 때문에, 그것은 NULL으로 초기화 있다는 것을 의미한다. 또한 프로그램을 수정하지 않으므로 프로그램 수명 기간 동안 NULL으로 유지됩니다. (예, foo() 반환 후에도 존재한다.를)

int * iPtr = UTHOPICALMATCH; 
*iPtr = 5; 

나는 당신이 뭘 하려는지 볼 수 없습니다. UTHOPICALMATCH은 하드 코딩 된 임의의 주소로 보이는데 그 주소가 맞습니까? UTHOPICALMATCH가 유효한 포인터 인 경우 다음 방금 평등을위한 두 개의 포인터를 비교하기 때문에

if (foo() == UTHOPICALMATCH) 
    printf ("It's still defined behavior!!!\r\n"); // is this true? 

그것은 단지입니다. 그렇지 않으면 동작은 정의되지 않지만 사실은 siPtr이 정적 인 것과 아무 관련이 없습니다.

+0

내 질문에, 그것에 대해 유효합니다 foo(), 내 질문에, 존재하지 않는, 전에 foo() 호출됩니다. – dhein

+0

표준 정적에서 프로그램 실행에서 끝까지의 수명으로 설명되기 때문에, 내가 그것을 말할 수 있기 전에도 존재해야만했습니다. – dhein

+0

아니요,'foo'에 대한'first' 호출 전에는 존재하지 않습니다.'foo'에 대한 첫 번째 호출 이후에 프로그램이 종료되지만,'main' 또는 다른 함수로 접근 할 수 없습니다. 그것의'scope'는'foo'에만 제한됩니다. –