Q & A

헤더 파일 안에 전역 변수를 선언해도 되나요?

헤더 파일에 전역 변수를 선언했을 때 헤더 파일을 사용하는 소스 파일이 하나라면 문제가 없지만, 여러 소스 파일에서 헤더 파일을 사용하면 컴파일 에러가 발생합니다. 만약 헤더 파일 안에서 static을 붙여서 정적 전역 변수로 선언하면 헤더 파일을 포함할 때마다 정적 전역 변수가 계속 생겨나게 됩니다. 즉, 변수의 이름은 같지만 서로 별개인 상태가 됩니다. 따라서 전역 변수는 소스 파일에 선언하고, 다른 소스 파일에서는 extern으로 사용해야 합니다.

main함수에 *argv[]대신 **argv로 된 것도 있는데 쓸 수 있는건가요?

문자열 포인터의 배열을 이중 포인터로 표현한 것일 뿐 사용하는 방법은 차이가 없습니다.

왜 전역 변수와 정적 변수는 항상 0으로 초기화되고, 지역 변수는 안 그런가요?

C 표준에 따르면 전역 변수와 정적 변수는 컴파일 시점(compile-time)에 초기화됩니다. 즉, 프로그램이 시작될 때 초기화된 변수가 메모리에 로딩됩니다. 전역 변수와 정적 변수는 컴파일 시점에 주소가 알려져 있고 고정되어 있어서 실행 시점(run-time)에 초기화하는 것보다 컴파일 시점에 초기화하는 것이 더 효율적입니다.

자동 변수는 함수를 호출할 때마다 주소가 달라져서 실행 시점에 매번 초기화를 하면 성능이 떨어집니다. 그래서 자동 변수는 0으로 초기화해주지 않으며 프로그래머가 필요할 때 초기화합니다.

함수의 매개변수는 지역 변수인가요?

맞습니다. 함수의 매개변수는 함수의 지역 변수이면서 자동 변수입니다. 따라서 함수를 벗어나면 매개변수도 사라집니다.

int add(int a, int b)    // 매개변수 a와 b는 함수 add의 지역 변수이면서 자동 변수
{
    return a + b;    // 함수를 벗어나면 매개변수 a와 b는 사라짐
}