부스트코스/5. 메모리
[CS50] 5.7 메모리 교환, 스택, 힙
fromslow
2021. 2. 6. 22:44
메모리 안에는 데이터가 저장되는 구역이 나뉘어져 있다.
machine code - 머신코드가 저장된다.
globals - 프로그램 내 전역변수가 저장된다.
heap - malloc으로 할당된 메모리 데이터가 저장된다. 메모리가 할당될수록 범위가 아래로 늘어난다.
stack - 프로그램 내 함수와 관련된 것들이 저장된다. 함수가 호출될수록 범위가 위로 늘어난다.
heap과 stack은 제한된 메모리 하에서 서로 부딪힐 수 있는데 이를 각각 힙 오버플로우, 스택 오버플로우라고 한다.
before)
아래 코드는 main의 x,y가 swap 함수의 인자로 전달된다.
swap 함수에서는 x,y를 각각 a,b로 받고 서로 숫자를 바꾸는 동작을 수행한다.
#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);
swap(x, y);
printf("x is %i, y is %i\n", x, y);
}
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
그러나 이것은 실제로 x,y의 값이 바뀌지 않는다.
왜냐하면 a,b는 x,y의 값을 '복사'해서 함수에 전달된 것이기 때문에
모두 stack에 저장되지만 서로 위치가 달라서 메모리 주소가 다르다.
after)
#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);
swap(&x, &y);
printf("x is %i, y is %i\n", x, y);
}
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
이를 해결하기 위해서는,
swap 함수에 &x, &y로 변수의 주소를 넘겨주고,
*a, *b와 같이 포인터를 이용해야 한다.