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

메모리 교환

#include <stdio.h>
void swap(int a, int b);
int main(void)
{
int x = 1;
int y = 2;
swap(x, y);
}
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;

위 코드에서 swap 함수를 사용해도 x와 y의 값은 바뀌지 않는다.

함수 내에서 교환을 하는 a와 b는 x와 y의 값을 복사받은 값이지, x와 y가 아니기 때문이다.


컴퓨터의 메모리 안에는 저장구역이 나뉘어 있다.

memory

머신 코드 영역에는 우리 프로그램이 실행될 때 그 프로그램이 컴파일된 바이너리가 저장된다.

글로벌 영역에는 프로그램 안에서 저장된 전역 변수가 저장된다.

힙 영역에는 malloc으로 할당된 메모리의 데이터가 저장된다.

스택에는 프로그램 내의 함수와 관련된 것들이 저장된다.

이를 바탕으로 다시 생각해보면, 위의 코드에서 a, b, x, y, tmp 모두 스택 영역에 저장되지만 a와 x, b와 y는 그 안에서도 서로 다른 위치에 저장된 변수이다.


이 문제를 해결하려면 a와 b를 x와 y를 가리키는 포인터로 지정하면 해결된다.

swap

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

note

written by Caution-Sun