42SEOUL

[C / get_next_line] 정적 변수 (static variable)

daykim 2022. 3. 16. 16:24

 

정적 변수 (static variable)

함수가 종료되어도 프로그램이 종료되지 않는 이상 메모리상에 남아있는 변수

static 자료명 변수명;

보통 일반 지역변수는 스택(Stack) 영역에 저장된다.

이 스택 영역의 변수들은 함수 호출시 메모리에 할당되며 함수 종료시 메모리에서 사라진다.

static 변수는 데이터(Data)영역에 저장되는데, 전역 변수도 이곳에 저장된다.

데이터 영역은 프로그램 시작시 0 또는 NULL이 할당되며, 프로그램 종료시 소멸된다.

 

이해를 돕기위한 코드

int test()
{
    static int cnt = 0;
    cnt++;
    return (cnt);
}

int main()
{
    printf("%d\n", test());
    printf("%d\n", test());
    return (0);
}

위의 코드 실행시 결과

1
2

 

특징

  • static으로 선언한 변수는 0으로 초기화 된다.
  • static 변수는 외부 참조가 되지 않는다.
    • 정보 은닉
  • static 변수는 매개변수로 사용할 수 없다.

 

static 포인터 선언시

포인터는 0으로 초기화된다.

따라서 매개변수로 넘겨줄 때 주의해야함

void func1(char *ptr)
{}

void func2(char **ptr)
{}

int main()
{
	static char *ptr;

	func1(ptr);

	func2(&ptr);
}

위와같은 상황에서 func2의 방법을 사용해야 ptr을 의도대로 사용할 수 있다.

fuc1의 상황으로 전달시 매개변수는 NULL 포인터를 가리키게 된다.

따라서 func1에서 ptr의 값을 아무리 변경해도 main의 ptr의 값은 변하지 않는다.

'42SEOUL' 카테고리의 다른 글

[Linux] SIGSEGV  (0) 2022.03.26
[C / get_next_line] 파일 디스크립터 (File Descriptor)  (0) 2022.03.16
[C / Libft] 컴파일 과정  (0) 2022.03.09
[C] File 종류와 함수  (0) 2022.03.08
[C] LIBFT 정리  (0) 2022.02.13