C 14Day (20160126)
by jennysgap기억 클래스
정의
- 데이터를 저장하는 메모리 공간의 영역을 규정짓는 것
- 어떤 변수가 메모리 어느 영역에 할당되냐에 따라 변수의 생존 범위와 생존 기간, 사용 범위가 달라진다.
지역 변수
- 중괄호 내에 선언되는 변수 (지금까지 우리가 사용했던 것들 ~~전부 지역변수라고 생각하면 됨)
- 지역변수는 해당지역을 벗어나면 자동으로 소멸된다.
- 선언된 지역 내에서만 유효하기 때문에 선언된 지역이 다르면 이름이 같아도 문제가 되지 않는다.
(함수가 시작될 때 메모리 공간이 생기고 함수가 종료될 때 메모리 공간에서 없어진다.)
이러한 지역변수들은 stack메모리에 할당된다.
전역 변수
- 전역변수는 함수 외부에 선언된다.
- 프로그램의 시작과 동시에 메모리 공간에 할당되어 종료 시까지 존재한다.
- 별도의 값을 초기화하지 않으면 0으로 초기화한다.
- 프로그램 전체 영역 어디서든 접근이 가능하다
지역변수(Local Variable) 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <stdio.h> int One(void) { int num = 10; num++; printf("One : %d \n", num); return 0; } int Two(void) { int num1 = 20; int num2 = 30; num1++, num2--; printf("num1 & num2 : %d %d \n", num1, num2); return 0; } int main(void) { int num = 17; One(); Two(); printf("maint num : %d \n", num); return 0; } | cs |
main ---> 17 num
One ---> 10 num ---> 11num 출력 ---> 종료
Two ---> 20 num1 / 30 num2 ---> 21 num1 / 29 num2 출력 ---> 종료
main ---> 17 num 출력 ---> 종료
즉, num은 이름이 같지만 서로 다른 변수임 (각 함수 내에서만 유효)
다양한 형태의 지역변수 예제
지역변수는 외부에 선언된 동일한 이름의 변수를 가린다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int main(void) { int num = 1; if (num ==1) { int num = 7; num += 10; printf("if문 내 지역변수 num : %d \n", num); } printf("main 함수 내 지역변수 num : %d \n", num); return 0; } | cs |
전역변수(Global Variable) 예제
- 프로그램이 시작되면 전역변수에 대한 메모리가 할당
- 프로그램이 종료될 때 메모리공간에서 소멸됨
- 메모리 공간중 Data영역에 저장됨
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> void Add (int val); int num; //전역변수는 기본 0으로 초기화됨 (지역변수와의 차이점) int main(void) { printf("num : %d \n", num); Add(3); printf("num : %d \n", num); num++; //전역변수 num의 값 1증가 printf("num : %d \n", num); return 0; } void Add(int val) { num += val; //전역변수 num의 값 val만큼 증가 } | cs |
0 num
main ---> 0 출력 ---> 매개변수를 통한 3값이 저장 ---> 3 출력 ---> +1 ---> 4 출력
전역변수의 문제점 ?
전역변수의 변경은 전체 프로그램의 변경으로 이어질 수 있으며
전역변수에 의존적인 코드는 프로그램 전체 영역에서 찾아야 한다.
어디서든 접근이 가능한 변수기 때문에....
가급적이면 사용금지 (사용 안하는 것을 추천!!)
static변수
전역변수의 문제점을 어느정도 해결하고 사용할 수 있는 변수
- 중괄호 내부에 선언되어 반환형 앞에 static 변수 입력하면 됨
- 프로그램이 시작되면 메모리 공간에 할당된다. (=전역변수랑 비슷)
- Data 영역에 저장된다.
- 지역변수와 전역변수의 짬뽕이라고 생각하면 된다.
- static변수는 무조건 내부에서만 접근이 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> void SimpleFunc(void) { static int num1 = 0; // 초기화하지 않으면 0 초기화 int num2 = 0; // 초기화하지 않으면 쓰레기 값 초기화 num1++, num2++; printf("static : %d, local : %d \n", num1, num2); } int main(void) { int i; for(i=0; i<3; i++) SimpleFunc(); return 0; } | cs |
num=0 / num=0 ---> +1 +1 ---> 종료
함수가 종료되도 static변수는 메모리 공간에 남아있다.
static변수는 그대로~~~
프로그램이 실행되면 static지역변수는 해당 함수에 존재하지 않는다.
기억 클래스
static변수
- 선언된 함수 내에서만 접근이 가능하다. (지역변수 특성)
- 딱 1회 초기화되고 프로그램 종료 시까지 메모리 공간에 존재한다. (전역변수 특성)
Register변수
- 다음 시간에 수업
register 변수 맛보기~
1 2 3 4 5 6 | #include <stdio.h> int main(void) { register int num = 5; .... } | cs |
- 레지스터는 CPU내부에 존재하는 메모리로 접근이 가장 빠른 메모리 장치다.
- Resister는 힌트를 제공하는 키워드
- 컴파일러는 이를 무시하기도 한다.
(무시하기 때문에 안쓴다고 생각하면 됨!!!)
static 변수의 활용
- 전역변수가 필요한 이유
선언된 변수가 함수를 빠져나가도 계속해서 메모리 공간에 존재할 필요가 있다. - 전역변수, static변수
함수를 빠져나가도 계속해서 메모리 공간에 존재해야 하는 변수를 선언하는 방법
(전역변수는 왠만하면 사용하지 말라고 했었죠
그래서 조금이나마 안전하게 사용하라고 static변수를 사용하면 됨) - static 지역변수를 사용하여 전역변수의 선언을 최소화하자
static 지역변수는 접근의 범위가 전역변수보다 훨씬 좁기 때문에 훨씬 안정적이다.
메모리 공간
메모리 공간은 4가지로 분류됨
- Code : 내가 작성한 모든 코드~가 저장됨 (기계어로 변환되어 저장)
- Data : 전역변수가 저장되는 영역 (프로그램 종료되면 소멸)
- Heap : 동적할당(가변적 공간 할당), 원하는 시점에 할당-원하는 시점에 소멸
- Stack : 지역변수, 매개변수 (함수가 시작될 때 메모리에 할당했다가 종료되면 자동 소멸)
메모리 구조
- 피라미드 형!
- 피라미드의 크기는 용량을 의미
- CPU와의 거리를 의미
모든 연산은 CPU에서 처리함(CPU가 좋으면 빠르고 좋겠죠?)
반응형
'BOX' 카테고리의 다른 글
C 16Day (20160128) (0) | 2016.01.31 |
---|---|
C 15Day (20160127) (0) | 2016.01.31 |
C 13Day (20160125) (0) | 2016.01.27 |
C 12Day (20160122) (0) | 2016.01.23 |
C 11Day (20160121) (0) | 2016.01.22 |
블로그의 정보
jennysgap
jennysgap