2011. 11. 2. 12:47
기본적으로 변수의 종류에는 static 과 auto 가 있다.
static라고 명시 하지 않으면, 모든 지역변수는 auto 이다.
auto는 변수가 선언됨과 동시에 자동으로 할당되고, 해당 지역이 끝나면 자동으로 해제된다.
static는 한번 할당되면, 해당 프로그램이 종료되기 전까지 해제되지 않고 스택영역에 남는다.

auto 변수는 자동으로 초기화 되지 않는다. 따라서 초기화 하지 않고 사용할 경우, auto 변수에는 의도하지 않는 의미 없는 값이 들어있다. 쓰레기 값이라고도 부른다. 디버깅 환경에서는 초기화 하지 않는 변수에 특별한 값으로 초기화 하기도 한다. 이 값을 보고, 어떤 변수가 어디에 할당되었는지 알수 있다. 이런 특별한 경우를 제외하면, 쓰레기 값이 들어있기 때문에(이전 메모리에 있던 값) 초기화 하지 않은 변수를 사용할땐 조심해야 한다.

static 로 선언된 변수와, 전역변수는 명시적으로 초기화 하지 않아도 자동으로 초기화 된다.
우선 정수는 0, 실수는 0.0 이 기본 초기화 값이다.
문자열은 '\0', 포인터는 NULL으로 초기화 된다.
구조체의 경우, 구조체 멤버가 각각 위의 기본 초기화 값으로 초기화된다.
배열의 경우, 일부분만 초기화 되면, 초기화 하지 않은 나머지 부분이 모두 기본 초기화 값으로 초기화 된다.

int num;             // num이 전역변수인 경우 0으로 자동으로 초기화 된다.
double real;         // real이 전역변수인 경우 0.0으로 자동으로 초기화 된다.
char *ptr            // ptr역시 NULL로 자동으로 초기화 된다.
struct {
    int a;
    double b;
    char *c;
} A;                 // A.a는 0, A.b는 0.0, A.c는 NULL로 초기화 된다.




int arr[10] = { 7, 8 };
int arr2[10] = { [3] = 7, [4] = 8 };


이경우 arr이 전역배열이나 static형 배열이 아니어도, 나머지 arr[2] ~ arr[9]는 int의 기본 초기화 변수인 0으로 초기화 된다. arr2의 경우 arr2[3], arr2[4]는 각각 7,8로 초기화 되고, 나머지 arr2[0]~arr2[2], arr2[5]~arr2[9]는 0으로 초기화 된다.


int arr[10] = {0};
int arr[10] = {0,};

간혹 int arr[10]을 0으로 초기화 하기 위해, int arr[10] = {0,}; 라고 0뒤에 , 콤마를 써주는 경우를 자주 볼수 있는데, 반드시 필요한 것은 아니다. 위의 두가지 배열은 정확히 똑같다.

 
Posted by Нуеоп