C Language

C언어 전역변수와 지역변수, 매개변수(+가변매개변수)의 개념

567Rabbit 2024. 6. 19. 11:46

https://codebunny99.tistory.com/122

 

CPU 메모리에 대해 학습하기

(형식) 변수 = 데이터 =을 기준으로 왼쪽은 변수, 오른쪽은 데이터라고 한다. count = 3 코드 (Code) 영역:프로그램의 "요리책"이라고 생각할 수 있다.요리책에는 요리 방법(명령어)들이 적혀

codebunny99.tistory.com

 

 

변수의 속성

 

- 이름, 타입, 크기, 값 + 범위, 생존시간, 연결

 

범위(scope) : 변수가 사용 가능한 범위, 가시성

생존 시간(lifetime) : 메모리에 존재하는 시간

연결(linkage) : 다른 영역에 있는 변수와의 연결 상태

 

 

 

 

변수의 범위(scope) : 전역변수와 지역변수

//---------전역변수의 범위 시작----------

#include<stdio.h>
               
int A;         //전역변수. 초기값은 0
int B;         //전역변수. 초기값은 0

int add()
{
    return A + B;
}

int main()
{

    int answer;   //지역변수
    
    //---------지역변수의 범위 시작----------
    
    A = 5;
    B = 7;
    
    answer = add();
    printf("%d + %d = %d\n", A, B, answer);
    
    //---------지역변수의 범위 끝----------
    //---------전역변수의 범위 끝----------
    
    return 0;
}

 

 

전역 변수 Global Variables

- 전역 변수는 함수 외부에서 선언된 변수로, 프로그램의 모든 함수에서 접근 가능하다

- 전역 변수의 범위는 소스파일 전체이다.

- 전역 변수는 프로그램의 전체 수명 동안 존재하며, 특정 메모리 영역에 저장된다

- 변수는 디폴트로 0으로 초기화되어있지만, 기본적으로 초기화 시키는 것이 좋다.

 

 

지역 변수 Local Variables

- 지역 변수는 함수나 블록 내에서 선언된 변수로, 선언된 함수나 블록에서만 접근 가능하다.

- 지역 변수는 해당 블록이 실행될 때 생성되고, 블록이 종료되면 소멸된다.

- C 언어에서 지역 변수는 기본적으로 연결이 없다. 즉, 다른 파일이나 다른 블록에서 접근할 수 없는 고유한 변수이다.

- 변수를 0으로 초기화하여야 한다.

 

 

 

지역 변수를 초기화하는 이유

 

- 지역 변수는 선언된 함수나 블록이 실행될 때 메모리에 할당된다. 이 때, 초기화되지 않은 지역 변수는 이전에 사용한 메모리의 값(쓰레기 값)을 가지고 있을 수 있다. 이 값을 사용하면 예상치 못한 결과를 초래할 수 있다.

- 초기화된 지역 변수는 예측 가능한 값을 가지고 있다. 이는 프로그램의 동작을 예측하기 쉽게 만들어주며, 버그를 찾고 수정하는 데 도움이 된다.

 

 

 

 

# 매개변수도 일종의 지역변수이다.

 

- 매개변수와 지역 변수 모두 스택 메모리(stack memory)에 저장된다.

#include <stdio.h>
int inc(int counter);

int main(void)
{
    int i;
    
    i = 10;
    return 0;
}

void inc(int counter){  //매개변수도 일종의 지역변수
	counter++;
}

 

 

매개변수의 특징

 

- 함수 호출 시 매개변수가 스택 프레임에 할당되고, 함수 종료 시 해당 프레임이 제거되면서 변수도 제거된다.

- 매개변수는 함수 호출 시 전달된 값으로 초기화됩니다. 호출자가 전달한 값이 매개변수의 초기값이 된다.

- 그러므로 함수 외부에서 접근할 수 있는 방법이 제한된다. 일반적으로는 함수 내부에서만 사용된다.

 

 

 

 

가변 매개 변수

 

- 매개변수의 개수가 가변적으로 변할 수 있는 기능

- int sum ( int num, ... ) 과 같이 쓴다.

#include <stdio.h>
#include <stdarg.h>  // 가변 변수를 처리할 수 있게 임포트
int sum (int, ...);
int main(void)
{
	int answer = sum(4, 4, 3, 2, 1); // 변수 개수 상관 x
    printf("합은 %d입니다\n", answer);
    return(0);
}

int sum( int num, ... )  // 가변 변수 처리 함수
{
    int answer = 0;
    va_list argptr;
    va_start(argptr, num);
    for ( ; num > 0 ; num-- )
    	answer += va_arg( argptr, int );
    va_end( argptr );
    
    return( answer );
}