프로그래밍 공부
작성일
2023. 3. 15. 17:54
작성자
WDmil
728x90

이번에는 전역변수에서의 함수가 어떤식으로 전역변수와 지역변수를 받는지 알아보자

local count 가 1이 되는것 을 알 수 있다.

지역변수가 1이 계속 선언됨 으로 선언될 때 마다 1이 한개 더해지고 1이 되고가 반복되어 local count가 1로 출력된다.

여기서 static 으로 선언하면 어떻게 되는지 보자.

위와 같이 나타남을 알 수 있다. static int 가 count가 데이터가 중첩됨을 알 수 있다.

즉, count가 전역변수 처럼 취급되어 데이터가 중첩됨을 볼 수 있다.

static은 한번만 초기화를 (최초선언시에만 변형이 가능하다.) 유효범위는 선언한 위치에서만 동작한다.


    Memory structure
    ------------------------------------------------------------------------ High Address
    |                        스택 영역                              |
    |                         Stack                                   | -->  메모리 크기를 컴파일러가 예측 가능 할때 사용,

   ㅣ                        ㅣ                                       ㅣOS에 메모리를 받아올때 속도가 빠름
    |                           |                                         |
    . . . . . . . . . . . . . . | . . . . . . . . . . . . . . . . . . .
    |                           |                                         |
    |                           v                                        |
    |                          Free                                   |
    |                           ^                                        |
    |                           |                                         |
    . . . . . . . . . . . . . . | . .  . . . . . . . . . . . . . . . . . . .
    |                           |                                         |
    |                         Heap                                   | --> 메모리 크기를 예측 불가능 할때
    |                        힙 영역                                 |
    ---------------------------------------------------------   이 아래는 프로그램 시작전 메모리가 잡힌다
    |                           bss                                    | 초기화 되지 않은 전역변수가 저장되는 공간.
    |                            |                                        |
    |            Initialized Global/Static Variables     |
    |                        Data                                      |
    |                      데이터 영역                             |
    ---------------------------------------------------------
    |                                                                      |
    |                  Program Code(Read Only)         |
    |                         code                                     |
    |                        코드 영역                              |
    ---------------------------------------------------------- Low Address

    위로갈수록 가지는 주소값이 크다
    os에따라 다를수 있다.

 

전역변수는 0으로 선언하지 않아도 자동으로 0으로 초기화된다. 이러한 전역변수는 

bss에 저장된다.

stack

데이터가 저장된다. 저장되는것은 후입선출로 관리된다. 스텍은 영역이 크지 않아서 오버플로우가 발생할 수 있다.

for문이나 while문이 조건이 잘 들어가지 않아서 무한적으로 동작하면 메모리오버플로우가 일어나서 정지하는것 을 확인할 수 있다. 그것을 스텍오버플로우 라고 한다.

지역변수가 저장된다.

 

Heap

데이터의 메모리크기를 예측 불가능 할 때 동적영역을 조정해주어야 할 때 사용한다.

그러나 메모리를 직접적으로 건들여야 하기 때문에 불안정하고 느릴 수 있다.

그리고 사용자가 메모리 할당을 해제해줘야 하는 필요성이 있다.

이렇게 보면 되는데, 이걸 순서대로 작업해보면 다음과 같다.

1 sum              
2 sum num1            
3 sum num1 int n          
4 sum num1 int n num2        
5 sum num1 int n          
6 sum num1            
7 sum num1 int n           
8 sum num1 int n  num2        
9 sum num1 int n          
10 sum num1            
11 sum              
12                

이런 순서로 후입선출의 방식으로 동작하게 된다.


문자열, String에 대해 알아보자.

문자열은 char의 배열로 관리하게 되는데,

위와 같이 문자열이 스트링으로 출력된다.

이러한 문자열은 어떤식으로 저장되는지 표시하면,

h e l l o .... g e NULL  

이렇게 저장된다.

마지막은 NULL로 저장되어 문자열이 끝났다는 표시를 해주어야 컴퓨터가 그만 읽고 종료할 수 있기 때문이다.

예시를 보자.

이런식으로 표시가 되는데, \0, 0, NULL로 모두 표현이 가능하다. 그러나 '0'은, 아스키코드의 0을 표기하기 때문에 사용하면 48이 출력되어 사용하면 안된다. 표현예시를 한번보자.

 

위와 같이 표시가 될 것 이다.
배열이 5개가 아닌 6개임을 알 수 있다. 마지막에 0이 들어가기 때문
각각의 str을 다루는 변수를 예시로 출력한것이다. define으로 오류코드를 무시하게 선언해주어야 한다.

728x90