ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [메모리] 메모리 교환, 스택, 힙
    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

    댓글