2013-07-17 5 views
4

변수 예 : string_astatic 변수로 선언되면 차이점은 무엇입니까? C에서 객체의 수명 판정 무엇 개체의 수명은 어떻게됩니까?

const char *pString; 
void first(void) 
{ 
    const char string_a[] = " First string "; 
    pString =(char *)string_a; 
} 
void second(void) 
{ 
    const char string_b[] = " Second string "; 
    pString =(char *)string_b; 
} 
int main() 
{ 
    first(); 
    second(); 
    printf("%s\n", pString); 
} 
  • ?

  • 글로벌 변수의 파일 범위 사이의 차이점은 무엇입니까?

+1

참조 http://stackoverflow.com/questions/7632120/scope-vs-life-of-variable-in-c – torek

+6

* "개체의 수명"*? 무슨 소리 야? C에는 개체가 없습니다. – m0skit0

+0

m0skit0에 대해 자세히 설명하기 위해 C에 객체가 없으므로이 질문은 모호합니다. 예를 들어,'string_a'의 수명에 대해 이야기 할 때, 포인터 자체의 수명이나 포인터가 가리키는 것의 수명을 의미하는지 여부는 분명하지 않습니다. 애매한 질문을하면 혼란스러운 답을 얻는 경향이 있습니다. –

답변

4

static에는 파일의 전역 범위에 static과 기능 내에 static의 두 종류가 있습니다.

전자는 개체에 대한 내부 연결을 선언합니다. 이는 파일 내에서만 액세스 할 수 있음을 의미합니다. 이러한 개체는 에 생성되고 main()이 입력됩니다. 해당 메모리 영역은 main()이 실행되기 전에 모두 0으로 설정되어 항상 memset입니다. 기능의 범위를 외부에서 만든 개체에 대한

기본값은 그들이 extern 키워드를 사용하여 다른 컴파일 단위에서 액세스 할 수 있습니다 의미 글로벌 (외부 링크)되고 있습니다.

static은 함수가 처음 호출 될 때부터 프로그램이 끝날 때까지 존재한다는 것을 의미합니다.

그림 :

int external_linkage; 
static int internal_linkage; 

void foo() 
{ 
    static int static_in_function; 
} 

세 가지 변수는 프로그램 스택과 힙 변수와는 달리, 실행시 0의 값을 가지고을 보장 있습니다.

0

글로벌은 extern 키워드를 사용하여 다른 파일에서 해당 변수에 액세스 할 수 있음을 의미합니다. 파일 범위는 해당 변수가 다른 파일에 표시되지 않음을 의미합니다. c에서 기본적으로 모든 전역 변수에는 전역 범위가 있습니다. 누구든지 글로벌 변수를 다른 파일에 보이지 않게하려면 전역 변수를 static 키워드로 정의합니다. static 키워드는 전역 범위를 파일 범위로 변환합니다.

2

정적 변수는 file scope이고 internal linkage입니다. 즉,이 변수는 다른 번역 단위에서 액세스 할 수 없습니다.

또한 전역 변수는 file scope이지만 external linkage입니다. 즉, 이러한 변수는 다른 번역 단위에서도 액세스 할 수 있습니다.

string_a는 함수 내에 정의 된 지역 변수입니다. 정적으로 만들어지면 함수가 호출되면 존재하게되고 프로그램이 끝날 때까지 존재하게됩니다 (정적이 아닌 지역 변수는 함수가 끝나자 마자 존재하지 않습니다).

-1

함수의 정적 변수는 범위로 제한됩니다.이는 이러한 변수가 다른 기능에서 액세스 할 수 있지만, 지역 변수와는 달리 그 범위 후 파괴 아니에요 및

전역 변수는 파일 범위를 가지고 있지만, 그뿐만 아니라
extern 키워드를 제공하는 다른 파일에서 액세스 할 수있는 프로그램이 끝날 때까지 유지됩니다 것을 의미합니다 사용. 파일의 전역 범위에있는 static은 변수를 파일에만 한정합니다.

+2

C는 실제로 객체라고하는 무언가를 가지고 있습니다. 단지 OOP의 * object *와는 다른 것입니다. C의 * 객체 *는 실행 환경에서 ** 데이터 저장 영역으로 정의되며 그 내용은 값 **을 나타낼 수 있습니다. – Lstor

+0

내 대답을 수정했습니다. 나는 몰랐다. –

관련 문제