1. 메모리 교환
* 메모리 교환
- 변수 두 개의 값을 서로 바꾸는 함수를 만들어 보자.
- 먼저 변수 두 개의 값을 바꾸려면 임시 변수(tmp)를 만들어서 넣어가며 바꿔야 한다.
- 이를 구현하면 다음과 같을 것이다.
#include <stdio.h>
void swap(int a, int b);
int main(void)
{
int x = 1;
int y = 2;
printf("x is %i, y is %i\n", x, y); // x is 1, y is 2
swap(x, y);
printf("x is %i, y is %i\n", x, y); // x is 1, y is 2
}
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
- 함수 내에서 값을 교환하는 것 같지만 swap함수를 거치더라도 x와 y의 값은 바뀌지 않는다.
- 이유는 swap함수는 교환을 제대로 하기는 하지만 교환 대상이 x,y자체가 아니라 함수 내에서 새로 정의된 a,b이고, a와 b는 x와 y의 값을 각각 새로 복제하여 가진다. 즉 서로 다른 메모리 주소에 저장된다.
- 제대로 교환을 하려면 주소와 포인터를 이용해야한다. 이는 아래에서 알아보자.
2. 메모리 구역
* 머신코드와 글로벌 영역
- 메모리 안에는 데이터가 저장되는 구역이 나누어져 있다.
- 머신 코드 영역에는 프로그램이 실행될 때 그 프로그램이 컴파일된 바이너리가 저장된다.
- 글로벌 영역에는 프로그램 안에서의 전역변수가 저장된다.
* 힙 영역과 스택 영역
- 힙 영역에는 malloc으로 할당된 메모리의 데이터가 아래를 향해 저장된다.
- 스택영역에는 프로그램 내의 함수와 관련된 것들이 위를 향해 쌓이며 저장된다.
- 이를 바탕으로 위의 코드를 보면 a,b,x,y,tmp 모두 스택 영역에 저장된다. 그러나 a와x, b와y 는 그 안에서도 서로 다른 위치에 저장된 변수이다. 즉 a와 b를 바꾸는 행위는 x와 y와는 전혀 무관하다.
- 따라서 a와 b를 각각 x와 y가 가리키는 포인터로 지정하면 문제가 해결된다.
- 위 그림과 같이 한다면 주소로 직접 접근하여 값을 교환하므로 올바르게 작동할 것이다.
#include <stdio.h>
void swap(int *a, int *b);
int main(void)
{
int x = 1;
int y = 2;
printf("x is %i, y is %i\n", x, y); // x is 1, y is 2
swap(&x, &y);
printf("x is %i, y is %i\n", x, y); // x is 2, y is 1
}
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
참고
이 글은 하버드 대학교 David Malan 교수의 CS50 강의를 수강 후 정리하며 쓴 글입니다. 코드는 C언어로 작성되었으며, 개발환경은 CS50 IDE에 최적화되어 있습니다. 일부 라이브러리는 다른 환경에서 별도의 설정이 필요할 수 있습니다.
CS50 공식사이트
부스트코스
CS50 IDE
'Computer Science > Computer Organization' 카테고리의 다른 글
<메모리> V8 엔진의 메모리 (2) | 2021.08.17 |
---|---|
<메모리> 문자열과 메모리 (0) | 2021.02.18 |
<메모리> 메모리와 포인터 (0) | 2021.02.17 |
<컴퓨터 구조> 컴파일링과 디버깅 (0) | 2021.01.27 |
<컴퓨터 구조> 하드웨어의 한계 (0) | 2021.01.20 |