CS 기초/메모리

[CS50] 메모리 교환, 스택, 힙

담크 2021. 8. 24. 23:56

오늘은 메모리에 이미 저장된 값을 교환할 때 어떤 방식으로 교환해야 하는지에 대해 공부해보도록 하겠습니다.

 

가장 먼저 swap이라는 함수를 따로 만들어서 입력받은 정수 a, b를 교환하는 작업을 해보도록 하겠습니다.

#include <stdio.h>

void swap(int a, int b);

int main(void)
{
    int x = 1;
    int y = 2;

    printf("x 는 %i, y 는 %i\n", x, y);
    swap(x, y);
    printf("x 는 %i, y 는 %i\n", x, y);
}

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

 

위의 코드처럼 x, y에 각각 정수를 입력하고 swap 함수를 사용해 바꿔봤습니다.

결과가 어떻게 나올까요??

분명히 컴파일도 에러없이 잘 되고 함수에 문제가 있는 것도 아닌데 x, y가 바뀌지 않았습니다. 왜일까요?

그 이유는 swap함수가 교환하는 x, y 자체의 값이 아닌 함수에 새로 정의된 a, b를 바꿔줬기 때문입니다. 이 a, b는 x와 y의 복제된 값(즉 다른 메모리 주소를 가지는)을 가지고 있기 때문에 바뀌지 않은 상태로 출력되는 것입니다.

 

실제로 메모리 안에는 데이터가 저장되는 구역이 나눠져 있습니다. 

machine code 영역에는 프로그램이 실행될 때 컴파일된 바이너리가 저장되고,

global 영역에는 프로그램 안에서 저장된 전역 변수,

heap 영역에는 malloc으로 할당된 메모리의 데이터가 저장되고,

stack 영역에는 프로그램 내의 함수와 관련된 것들이 저장됩니다.

이를 생각해본다면 위 코드의 a, b, x, y, tmp 모두 stack영역에 저장되지만 a, b는 x, y와 다른 위치에 저장되어있기 때문에 a, b를 바꾸더라도 x, y는 바뀌지 않는 겁니다.

 

그럼 어떻게 해야 x, 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 는 %i, y 는 %i\n", x, y);
    swap(&x, &y);
    printf("x 는 %i, y 는 %i\n", x, y);
}

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

잘 바뀌어서 출력되는 것을 확인할 수 있습니다.


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 메모리' 카테고리의 다른 글

[CS50] 파일 읽기  (0) 2021.08.26
[CS50] 파일 쓰기  (0) 2021.08.25
[CS50] 문자열 복사  (0) 2021.08.22
[CS50] 문자열 비교  (0) 2021.08.21
[CS50] 문자열  (0) 2021.08.20