학습 목표
메모리에 저장된 두 값을 교환하는 코드를 작성할 수 있다.
메모리 교환
입력값을 바꾸는 함수를 만들어 프로그램을 작성해보자.
#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;
}
프로그램을 살펴보자.
- 정수 a와 b를 입력받아 값을 바꾸는 swap() 함수를 만들었다.
- swap() 함수는 같은 정수형 변수 tmp를 사용해 값을 바꾼다.
- main 함수에서 swap() 함수를 실행시킨 후 값을 출력한다.
프로그램의 결과다. 의도했던 것과 달리 값이 변하지 않았다. 문제는 다음과 같다.
- swap() 함수는 사실 교환을 제대로 수행하고 있다.
- 하지만 교환하는 대상이 실제 x, y가 아닌 새롭게 정의된 a, b이다.
- a와 b는 각각 x와 y의 값을 복제해서 가진다.
- 즉 둘은 서로 다른 메모리 주소에 저장된다.
메모리 힙과 스택
지난 포스팅에서 메모리 안에는 데이터가 저장되는 구역이 나뉘어 있다는 것을 언급했다.
- 코드(code) 영역에는 실행할 프로그램의 코드가 저장된다. CPU가 코드 영역의 명령어를 하나씩 가져가서 처리한다.
- 데이터(data) 영역에는 전역 변수와 정적(static) 변수가 저장된다. 데이터 영역은 프로그램 시작과 함께 할당되며, 종료와 함께 소멸한다.
- 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개 변수가 저장된다. 스택 영역은 함수의 호출과 함께 할당되며, 호출이 완료되면 소멸한다.
- 힙(heap) 영역은 사용자가 직접 관리하는 메모리 영역으로, 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
이를 토대로 위의 예제 프로그램을 다시 생각해보자. 코드에서 a,b,x,y,tmp는 모두 스택 영역에 저장된다. 하지만 a와 x, b와 y는 그 안에서도 서로 다른 위치에 저장된다.
포인터
앞서 배운 포인터를 활용하면 문제를 해결할 수 있다. a와 b를 각각 x와 y를 가리키는 포인터로 지정하자.
swap 함수의 입력값으로 변수의 메모리 주소를 보내고, 포인터를 활용해 값을 바꿨다.
프로그램을 실행하니 원하는 결과가 나왔다.
생각해보기
메모리 영역을 다양하게 나누는 이유는 무엇일까?
메모리 공간 관리에 있어 효율적이다. 사용자는 각 영역의 장단점을 따져 메모리를 사용할 수 있다.
메모리 공간 사진 및 내용 출처
이 글은 네이버 부스트 코스 David J. Malan(데이비드 J. 말란) 교수님의 모두를 위한 컴퓨터 과학(CS50 2019) 강의를 수강하고 작성한 글입니다. 본 강좌 내 실습에서는 CS50 Sandbox를 사용합니다.
'Programming > C' 카테고리의 다른 글
C 언어 | malloc과 포인터 (0) | 2021.02.26 |
---|---|
C 언어 | 파일 쓰기와 읽기 (0) | 2021.02.22 |
C 언어 | 메모리 할당과 해제 (0) | 2021.02.22 |
C 언어 | 문자열의 복사 (0) | 2021.02.20 |
C 언어 | 문자열의 비교 (0) | 2021.02.20 |