티스토리 뷰

 

7. 메모리 교환, 스택, 힙

heap과 stack
machine code    ✔  프로그램 시작 → 메모리 가장 위에  머신 코드가 올라간다.
globals     ✔  프로그램이 사용하는 전역변수나 값은 machine code의 바로 아래 공간을 사용한다.
heap







   ✔  malloc() 호출 시, heap에서 메모리를 가져와 할당받는다.
   ✔  위에서 아래로 쌓인다.







stack
   ✔  함수를 호출할 때마다, 함수의 인자와 지역변수는 stack 공간에 위치한다.
   ✔  호출된 함수는 명령문을 모두 실행하면 함수를 다시 호출하지 않는 이상 작동하지 않는다.
   ✔
 stack은 메모리의 가장 아래 영역에 위치한다
   ✔  아래에서 위로 쌓인다

 

 

stack
#include <stdio.h>

void swap(int a, int b);

int main(void){
  int x=10,y=20;
  printf("%d,%d",x,y);
  swap(x,y);
  printf("%d,%d",x,y);
  return 0;
}

void swap(int a, int b){
  int temp;
  temp = a;
  a = b;
  b = temp;
}

✔  위와 같은 swap 기능을 담당하는 함수가 있다고 가정했을 때의 메모리 사용을 살펴보자.

✔  먼저 프로그램이 시작되며, stack의 가장 아래에 main함수가 호출된다.

✔  main함수는 swap함수를 호출하므로, main함수의 윗부분에 swap 함수가 쌓인다.

✔  main함수의 x, y와 swap함수의 a, b, temp는 모두 stack 영역에 저장되지만, stack 영역 안에서도 다른 위치에 저장되어있다.

✔  즉, swap함수에서의 a와 b의 값의 교환은 main함수의 x, y에 영향을 주지 못한다. 자세히 살펴보면 아래와 같다.

 

메모리 사용 1 2 3 4 5 6 7 8
machine code machine code machine code machine code machine code machine code machine code machine code machine code
globals                 
heap





               
  swap a,b,temp 1,2,temp 1,2,1 2,2,1 2,1,1 2,1,1
stack main main x,y 1,2 1,2 1,2 1,2 1,2

0. 프로그램이 시작하면 메모리의 최상단에 machine code가 올라온다

1. 프로그램이 시작하면 main함수가 호출되므로 stack의 가장 아래에 main함수가 자리한다.

2. main함수에서 swap 함수를 호출. stack은 아래에서 위로 쌓이므로, main함수 위에 swap함수가 자리한다.

3. main함수는 변수 x, y를 가지며, swap는 변수 temp와 인자로 받아온 a, b를 가진다.

4. 각 변수들이 가지는 값은 이와 같다.

5. swap 함수의 명령문 temp=a 실행 (temp=1)

6. swap 함수의 명령문 a=b 실행 (a=2)

7. swap 함수의 명령문 b=a 실행 (b=1)

8. swap 함수의 실행 결과 변수 a, b, temp는 차례로 2,1,1의 값을 가진다.

9. swap함수에서의 a와 b의 값의 교환은 main함수의 x, y에 영향을 주지 못했으므로, x,y의 값은 그대로 1,2임을 알 수 있다.

 

 

#include <stdio.h>

void swap(int *a, int *b);

int main(void){
  int x=10, y=20;
  printf("%d,%d",x,y);
  swap(&x,&y);
  printf("%d,%d",x,y);
  return 0;
}

void swap(int *a, int *b){
  int temp;
  temp = *a;
  a = *b;
  b = temp;
}

✔  실제로 swap함수를 통해 main함수의 변수 x,y에 영향을 주기 위해서는 위와 같이 포인터를 사용해야 한다.

✔  아래의 그림처럼 a와 b가 각각 x와 y를 가리키는 포인터로 지정됨으로 swap함수를 의도대로 동작하게 할 수 있다.

 

[출처] 모두를 위한 컴퓨터 과학

 

 

 

 

[출처] 부스트코스 | 모두를 위한 컴퓨터 과학(CS50 2019)

댓글
«   2024/12   »
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 28
29 30 31
최근에 올라온 글
글 보관함
Total
Today
Yesterday