![[CS50] 메모리 - 메모리 교환, 스택, 힙](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs74Er%2FbtsH0WPyOdN%2Fuxk7A4ubrdqXJbYV9eK7x0%2Fimg.jpg)
아래 코드에서 함수 swap
은 정수 a
와 b
를 입력받아 서로의 값을 바꾸는 일을 수행한다.
main
함수에서는 x
에 1, y
에 2를 입력하고 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);
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
의 값이 바뀌지 않은 채 그대로 출력됨을 알 수 있다.
사실 swap
함수는 교환 작업을 제대로 수행하고 있다. 문제는 교환하는 대상이 x
, y
그 자체가 아닌 함수 내에서 새롭게 정의된 a
, b
라는 것이다.
a
와 b
는 각각 x
와 y
의 값을 복제해서 가지게 되며 서로 다른 메모리 주소에 저장된다.
메모리 구조를 이해하면 왜 이런 과정이 생기는지 이해할 수 있다.
메모리 안에는 데이터가 저장되는 구역이 나뉘어져 있다.
프로그램이 실행될 때 컴파일된 바이너리는 코드 영역에, 전역 변수는 데이터 영역에, 동적 할당된 메모리는 힙 영역에, 그리고 함수 호출 관련 정보는 스택 영역에 저장된다.

위의 코드에서 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);
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
함수는 포인터 a
와 b
를 통해 x
와 y
의 메모리 주소를 직접 받아서 그 주소에 있는 값을 실제로 바뀌게 된다.
코드를 컴파일하고 실행하면 swap
함수를 거친 후 x
와 y
의 값이 바뀌어 출력된다.
References
모두를 위한 컴퓨터 과학 (CS50 2019)
부스트코스 무료 강의
www.boostcourse.org
'CSE > CS 기초' 카테고리의 다른 글
[CS50] 자료구조 - malloc과 포인터 복습 (0) | 2024.06.18 |
---|---|
[CS50] 메모리 - 파일 쓰기 (0) | 2024.06.17 |
[CS50] 메모리 - 문자열 비교, 복사, 할당과 해제 (0) | 2024.06.17 |
[CS50] 메모리 - 문자열 (0) | 2024.06.17 |
[CS50] 메모리 - 포인터 (0) | 2024.06.14 |
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!