no swim no life

(작성) 변수 본문

work/fundamental

(작성) 변수

달려간다 2008. 9. 25. 20:11

변수의 종류

  • 전역변수
  • 정적변수(static)
  • 자동변수(지역변수, 매개변수)
  • 외부변수(extern)

저장공간의 종류

  • 코드영역
  • 데이터영역: 전역변수, 정적변수, 초기화된 배열과 구초제
  • 힙영역: malloc(), new 동적메모리할당, 포인터
  • 스택영역: 자동변수, 복귀번지, 배열, 포인터변수

extern

전역변수는 프로젝트 내의 동일한 메모리 공간을 사용한다.
extern으로 declaration 해야 되는곳에 값을 넣게 되면 definition이 되어 링크 에러가 발생할 수 있다.

file_a.c
int test = 3;

file_b.c

extern int test;  // declaration
extern int test = 3;  // definition

전역변수는 각각의 오브젝트 파일마다 메모리 공간을할당하지 않고고 하나에만 할당을 받게된다.
a.c에서 a를 선언하면 a.obj에서만 a가 메모리를 할당받는다.
b.c에서 전역 a 를 다시 선언하면 링크 에러 발생

b.c의 전역 a는 이미 선언되었으니 메모리는 할당하지 않고 a.c의 a를 가져다 쓰도록해야한다.

auto (local)

함수의 내부에 선언되며, 함수의 범위내에서 함수가 유지되는 동안 사용, Stack에 저장되며 초기화 되지 않는다.

static

블럭 안에서만 유효한 값을 가지지만 자동변수와 같이 없어지지 않고 블럭으로 다시 돌아왔을 때 이전 값을 다시 이용 가능

  • 초기화를 생략하면 0으로 자동 초기화
  • 힙(Heap)에 메모리 할당
  • 선언된 위치에 따라 다음과 같이 구분됨
    • 내부정적변수 : 함수 내부에서 선언되며, 함수 내부에서만 사용이 가능. 하지만, 프로그램이 실행되는 동안 존재
    • 외부정적변수 : 함수 외부에서 선언되며, 다른 소스파일에서는 참조할 수 없음

정리하면

static은 함수 또는 파일에서 값을 보존할 필요가 있을 때 사용

(어떤 함수를 몇 번 호출했는지 알고 싶을 때 static 변수를 선언해서 호출될 때마다 1씩 더해줌)

 

변수 및 저장 공간의 종류와 함수 호출시 스택(stack), 힙(heap)의 관계(자동변수/정적변수/동적영역 등)

register

 

Comments