| [ CnUnix ] in KIDS 글 쓴 이(By): windy96 (BrandNew) 날 짜 (Date): 2002년 11월 19일 화요일 오후 10시 52분 09초 제 목(Title): Re: [Q]c 질문 구루도 아니고, 어나니의 1억 2천도 아니고, bk 40이지만.. 그냥 정리해 봅니다. 총정리판입니다. --; (실은 시뮬레이션 돌려놓고.. 막간을 이용하여..) 1. 변수의 scope(범위) 문제 (이 변수라는 것이 일본말인데 좀 껄쩍지근하군요... 하긴 variable이라는 것 자체가 마음에 안 듭니다. --;) C언어에서 변수는 크게 지역 변수와 전역 변수로 구분할 수 있겠습니다. 사용자의 관점에서의 분류입니다. 전역(global) 변수는 당연히 그 파일의 전체에서 억세스가 가능하겠고, 지역(local) 변수는 그 변수의 scope 내에서만 억세스가 가능하겠지요. scope에서 이름이 같으면 작은 scope의 것이 우선한다는 것은 다 아실테구요. 기능상으로 구분하자면 자동(auto) 변수, 레지스터(register) 변수, 정적(static) 변수, 외부(extern) 변수가 있겠습니다. 우리가 함수 내에서, 즉 어떤 스코프 내에서 변수를 선언하면 당연히 지역변수이겠고.. 이것은 기본적으로 자동 변수가 됩니다. 자동 변수라고 부르는 이유는 변수 영역을 할당하고 해제하는 것이 자동으로 이루어진다는 뜻입니다. 레지스터 변수는 좀더 빠른 처리를 위해서 변수를 레지스터에 할당하는 것인데 요새 시스템이 워낙 빨라지고 또 컴파일러들이 똑똑해져서 이것을 굳이 명시적으로 하지 않아도 됩니다. 필요하면 알아서 해줍니다. 당연히 지역 변수로 씁니다. 일종의 자동 변수라고 보면 됩니다. 전역 변수로 사용 가능한지는 안 해봐서 모르겠습니다. 에러나 경고 뜨지 않을까나.. 정적 변수는 지역 변수로도 전역 변수로도 쓸 수 있는데 지역 변수로 쓰면 보통 함수 내에서 이전의 값을 기억하는 용도로 쓰입니다. 다른 변수들이 동적으로 공간이 할당되는 방식이라면 이 변수는 기억공간이 애초에 (compile time에..) 확보됩니다. 따라서 그 공간은 실행 시에 안 없어지고 계속 존재합니다. 또, 0으로 초기화가 되지요. 외부 변수는 프로그램 모듈이 여러 개 있을 때 하나의 변수를 선언해놓고 여기저기서 쓰기 위해서 있습니다. 좀 큰 프로그램 짜려면 당연히 요놈이 많이 쓰입니다. 소스 파일 단위, 프로그램 단위로 참조되니 당연히 전역이구요. 역시 값이 초기화되고 처음에 영역이 할당됩니다. 2. 자동 변수를 쓰면 생기는 문제점 int func0() { ... return result; } 이렇게 쓰면 아무런 문제 없습니다. 이건 value를 그대로 전달하니까요. 그런데 아래와 같은 경우에는 문제가 생깁니다. 포인터의 문제점이죠. char* func1() { char buf[10]; ... return buf; } 리턴받은 후에 곧바로 그냥 억세스하면 buf가 그대로 억세스 가능합니다. 하지만 좀 지나서는 어떻게 될 지 모릅니다. 좀 지나서 모른다는 이유는... 다른 함수 호출 시에 영역이 덮어써질 수 있다는 것이지요. printf나 strcpy를 호출하면 문제가 생긴다는게 이 뜻입니다. 3. 정리와 해결책 한마디로 정리하면 char* func1() { char buf[10]; ... return buf; } 이렇게 하지 말고 int func2(char* b) { // 당연히 b의 영역은 함수 호출 전에 정의되어 있어야 함. char buf[10]; ... strncpy(b, buf, 10); return error_code; } 혹은 int func3(char* b) { // 당연히 b의 영역은 함수 호출 전에 정의되어 있어야 함. // b 직접 억세스 ... return error_code; } 와 같은 형태로 작성해야 합니다. 취향과 상황의 문제지만 func2의 형태를 쓰는게 좋겠네요. 아싸. 다 썼다. -_-;; |