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

제리·2022년 6월 13일
0

CS50

목록 보기
7/13

메모리 교환, 스택, 힙

컴퓨터의 메모리는 일반적으로 아래처럼 공간을 나누어 사용된다.

  1. 머신코드 (clang 명령어 처럼 실행 시 100101 형태로 저장하는 코드)
  2. 전역변수
  3. 힙 ( malloc() 처럼 메모리를 동적으로 할당할때 사용되는 부분)
  4. 스택 ( main()함수, void()함수 등..)

메모리 교환 예시코드

아래 코드를 실행해보면 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); // 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)
{
  int tmp = a;
  a = b;
  b = tmp;
}

왜그럴까?

main()함수의 변수들은 main()함수 메모리 영역에 저장되지만 (x, y)
swap()함수의 변수들은 swap()함수의 메모리 영역에 저장된다. (a, b)

  • 즉, 서로 다른 메모리 공간에 저장되기 때문에, swap()함수는 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); // x is 1, y is 2
  swap(&x, &y);
  printf("x is %i, y is %i\n", x, y); // x is 2, y is 1
}

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

a와 b를 각각 x, y를 가리키는 포인터로 지정함으로써 swap()함수가 x, y의 값을 바꿀 수 있도록 해주었다.

profile
iOS 준비중

0개의 댓글