210114 개발일지(38일차) - c언어 알아보기(5) : swap함수 만들고, 메모리 교환에 대해 이해하기

고재개발·2021년 1월 14일
0

C Language

목록 보기
8/13

메모리 영역에서 스택과 힙

내 벨로그에도 이런 그림이 2번 정도 나왔었는데, 여기서 또 가져와봤다.

스택은 함수가 호출될 때, 지역 변수가 쌓이는 공간이다.
힙은 malloc이 메모리를 할당하는 공간이다.
(출처: https://gabrieletolomei.wordpress.com/miscellanea/operating-systems/in-memory-layout)

swap함수 만들고 이해해보기

아래와 같이 코드를 짜면 x,y 값이 바뀌어 인쇄될까?
답은 그렇지 않다. 왜 swap함수를 제대로 짰는데 교환이 되어 인쇄되지 않았을까?

#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)		//x,y를 바꿔주는 함수 만들기
{
    int tmp = a;
    a = b;
    b = tmp;
}

그 이유는 main함수 안에 있는, swap(x,y)에서 x와 y는 실제 swap함수 안으로 들어갈 때, x와 y의 값만 복사해서 들어가기 때문에 실제 x와 y의 값이 바뀌지 않는 것이다.

스택에 쌓이는 함수와 변수

위의 사진을 뒤집어놓은 형태로 스택에 대해, 위의 swap함수를 활용해 명쾌하게 설명되어 있어서 가져와봤다.
아래의 순서대로 main 위에 swap이 쌓여서 x, y 값을 a, b에 복사해온다. 그리고 swap함수 안에서 a와 b를 잘 바꿔주고 작업이 끝나면 main함수에 x와 y는 그대로 남아있는 것이다.
위에도 언급했듯 복사해온 값을 사용한다는 것이 근본적인 문제다.
어떻게 해결할 수 있을까? 답은 전에 포스팅했던 포인터에 있다.

포인터로 문제 해결

포인터는 주소를 가리킨다. 즉, 주소를 가리키면 주소에 찾아가서 직접 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);
    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에 값이 바뀐다. 어마어마한 친구인 포인터를 열심히 공부해보자!

profile
고재개발

1개의 댓글

comment-user-thumbnail
2021년 1월 18일

👍🏻멋지구마잉!!!! 🥰

답글 달기