009. VARIABLE – 2

Posted on by pkchan

009-01 // LOCAL VARIABLE

지역변수는 함수 내에서 선언되는 변수입니다. 함수 내에서 선언되고 함수 내에서만 쓰이며 함수가 종료되면 사라집니다. 또한 다른 함수에서 접근이 불가능합니다. 메인 함수에서 변수 이름이 같은 인자를 가진 다른 함수를 호출해도 이름만 같고 메모리상의 주소는 다릅니다. 변수가 가진 값만 복사됩니다.

009-02 // GLOBAL VARIABLE

전역변수는 함수 블록 밖에서 선언되는 변수입니다. 값이 사라지지 않고 계속 유지됩니다. 모든 함수가 접근이 가능합니다. 모든 함수에서 접근이 가능하기 때문에 관리하기가 어렵습니다. 전역변수에 문제가 발생하면 접근했던 전체 함수에 영향을 미치기 때문입니다. 이런 이유로 전역 함수는 선언과 사용에 주의가 필요합니다.

/*
 example 009-01
 C language global variable
*/

#include <stdio.h>

void display();

int n = 5;  //global variable

int main() {
          ++n;
          printf("n = %d\n", n);
          display();
          return 0;
}

void display() {
          ++n;
          printf("n = %d\n", n);
}

009-03 // STATIC VARIABLE

static (data_type) (variableName);

정적 변수는 지역변수와 마찬가지로 함수 내에서 선언되고 함수 내에서만 쓰이며 다른 함수가 접근할 수 없습니다. 그러나 함수가 종료되어도 정적 변수는 남아있습니다. 값도 그대로 가지고 있습니다.

/*
 example 009-02
 C language static variable
*/

#include <stdio.h>

void display();

int main() {
          display();
          display();
}

void display() {
          static int c = 0; //정적변수 선언및 초기화는 처음 한번만 실행

          printf("%d  ",c);
          c += 5;

}

009-04 // MEMORY LAYOUT

C언어로 코딩한 프로그램을 실행하면 모든 내용은 메모리에 저장됩니다. 각각의 변수들이 어떤 영역으로 배치되는지 메모리상의 영역을 설명합니다.

1. Code Segment

코드 세그먼트에는 기계어로 컴파일된 코드가 들어있습니다. 수정 할 수 없는 Read-Only 영역입니다.

2. Initialized Data Segment

초기화가 되어 있는 상수, 전역변수, 정적변수등이 있는 영역입니다. 리터럴 역시 이 구역에 있습니다. 이 구역은 Read-Only구역과 Read-Write구역으로 나누어져 있습니다. 상수와 리터럴은 Read-Only구역으로 초기화가 되어 있는 전역변수, 정적변수들은 Read-Write구역으로 분리 저장됩니다.

3. Uninitialized Data Segment

초기화가 되어있지 않은 전역변수, 정적변수는 0(zero)을 할당받고 이곳에 저장됩니다. 코딩시에 전역변수, 정적변수를 초기화 하지않아도 0으로 초기화되는 이유는 Uninitialized Data Segment에서 초기화를 진행하기 때문입니다.

4. Heap

힙영역은 메모리동적할당 영역이라고 봐도 무방합니다. malloc함수나 calloc함수에서 메모리의 할당을 요구하면 힙영역은 윗쪽으로 커지게 됩니다.

5. Stack

마지막으로 스택영역은 함수안에서 사용하는 지역변수를 위한 공간입니다. 많은 변수들이 선언되면 스택영역은 주소값이 낮은 쪽으로 커지며 지역변수가 소멸되면 주소값이 높은 쪽으로 줄어듭니다.

Leave a Reply