본문 바로가기
cs/CS50

5: 메모리-5(메모리 교환, 스택,힙)

by 이쟝 2021. 12. 4.

swap 함수를 이용해서 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를 입력받아 그 값을 바꾸는 일을 수행
  • main 함수에서 x에 1, y에 2를 입력하고 swap 함수를 통해 두 값을 바꾸려고 하고 있음(x는 2로 y는 1로)
  • 하지만 위 코드를 컴파일하고 출력하면 swap 함수를 거친 후에도 x와 y의 값이 바뀌지 않은 채 그대로 출력됨
  • 함수에 인자를 전달할 때 그 값을 복사해서 전달하기 때문에 함수에 전달되는 것은 x와 y의 복제본임 → 서로 다른 메모리 주소에 저장되는 것

데이터가 저장되는 구역

 

메모리 내부

  • 머신 코드 영역에는 프로그램이 실행될 때 그 프로그램이 컴파일된 바이너리(범위)가 저장됨
  • 글로벌 영역에는 프로그램 안에서 전역 변수가 저장됨
  • 힙 영역에는 malloc으로 할당된 메모리의 데이터가 저장됨. 사용자가 동적으로 할당하는 메모리 영역(사용자가 직접 관리할 수 있는 메모리 영역)
  • 스택 영역에는 프로그램 내의 함수와 관련된 것들이 저장됨(지역 변수와 매개변수가 저장되는 영역으로 함수가 호출될 때 지역 변수가 쌓이고 함수의 호출이 완료되면 소멸함), main 함수 안에 있는 변수는 모두 이 영역에 저장됨

예시 코드에서 a,b,x,y,tmp 모두 스택 영역에 저장되지만 서로 다른 위치에 저장된 변수이기 때문에 a와 b를 바꾸는 것은 x와 y를 바꾸는 것에 아무런 영향을 미치지 않음

→ 해결방법:  a와 b를 각각 x와 y를 가리키는 포인터로 지정함

 

#include <stdio.h>

void swap(int *a, int *b);  //swap의 프로토 타입


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,a,b의 구조

(swap &x, &y)  → x와 y의 주소에 가라!

int tmp = *a; → a의 화살표를 따라 x의 주소의 값에 가서 1을 tmp에 저장

*a = *b; → b의 화살표를 따라 y의 주소의 값에 가서 2를 x에 저장

*b = tmp; → tmp에 저장되어 있던 1을 b에 저장

 

결과

 

 

https://www.boostcourse.org/cs112/joinLectures/41307

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org