-
[메모리] 메모리 교환, 스택, 힙Stage/Computer Science 2021. 6. 1. 00:09
학습 목표
메모리에 저장된 두 값을 교환하는 코드를 작성할 수 있다.
1. 값 교환하기
a와 b의 값을 입력 받고 두 값을 교환하는 코드를 출력해보자.
#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 함수가 제대로 작동되지 않은 게 아니라, swap 함수는 교환 작업이 제대로 일어났는데 문제는 또 메모리 구조를 잘 몰라서 발생한 것이다.
2. 메모리 구조 이해하기
- 메모리 안에는 데이터 저장 구역이 나뉘어져있다.
- 머신 코드 영역에는 프로그램이 실행될 때 그 프로그램이 컴파일된 바이너리가 저장된다.
- 글로벌 영역에는 프로그램 안에서 저장된 전역 변수가 저장된다.
힙
영역에는 malloc으로 할당된 메모리 데이터가 저장된다.스택
영역에는 프로그램 내의 함수와 관련된 것들이 저장된다.- 코드에서 변수 x, y, tmp, a, b는 모두 스택 영역에 저장되는데, 그 안에서도 서로 다른 위치에 저장 됐다.
2.1 문제 해결하기
- 이 그림처럼 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; }
그림으로 같이 보니까 이해하기가 한결 나은데, 조금 헷갈린다.
자바에서는 포인터 개념이 없는데, 어떻게 다른지 찾아봐야겠다.
'Stage > Computer Science' 카테고리의 다른 글
[메모리] 파일 읽기 (0) 2021.06.01 [메모리] 파일 쓰기 (0) 2021.06.01 [메모리] 메모리 할당과 해제 (0) 2021.05.31 [메모리] 문자열 복사 (0) 2021.05.31 [메모리] 문자열 비교 (0) 2021.05.31