본문 바로가기

Computer Science/Computer Organization

<컴퓨터 구조> 메모리 교환, 스택, 힙

 

1. 메모리 교환

* 메모리 교환

 - 변수 두 개의 값을 서로 바꾸는 함수를 만들어 보자.

 

 - 먼저 변수 두 개의 값을 바꾸려면 임시 변수(tmp)를 만들어서 넣어가며 바꿔야 한다.

 

 - 이를 구현하면 다음과 같을 것이다.

 

#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;
}

 

 - 함수 내에서 값을 교환하는 것 같지만 swap함수를 거치더라도 x와 y의 값은 바뀌지 않는다.

 

 - 이유는 swap함수는 교환을 제대로 하기는 하지만 교환 대상이 x,y자체가 아니라 함수 내에서 새로 정의된 a,b이고, a와 b는 x와 y의 값을 각각 새로 복제하여 가진다. 즉 서로 다른 메모리 주소에 저장된다.

 

 - 제대로 교환을 하려면 주소와 포인터를 이용해야한다. 이는 아래에서 알아보자.

 

2. 메모리 구역

* 머신코드와 글로벌 영역

 - 메모리 안에는 데이터가 저장되는 구역이 나누어져 있다.

 

 - 머신 코드 영역에는 프로그램이 실행될 때 그 프로그램이 컴파일된 바이너리가 저장된다.

 

 - 글로벌 영역에는 프로그램 안에서의 전역변수가 저장된다.

 

* 힙 영역과 스택 영역

 - 힙 영역에는 malloc으로 할당된 메모리의 데이터가 아래를 향해 저장된다.

 

 - 스택영역에는 프로그램 내의 함수와 관련된 것들이 위를 향해 쌓이며 저장된다.

 

 - 이를 바탕으로 위의 코드를 보면 a,b,x,y,tmp 모두 스택 영역에 저장된다. 그러나 a와x, b와y 는 그 안에서도 서로 다른 위치에 저장된 변수이다. 즉 a와 b를 바꾸는 행위는 x와 y와는 전혀 무관하다.

 

 - 따라서 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); // 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;
}

 


 

 

참고

 

 

 이 글은 하버드 대학교 David Malan 교수CS50 강의를 수강 후 정리하며 쓴 글입니다. 코드는 C언어로 작성되었으며, 개발환경은 CS50 IDE에 최적화되어 있습니다. 일부 라이브러리는 다른 환경에서 별도의 설정이 필요할 수 있습니다.

 

 

 

CS50 공식사이트

 

CS50

Introduction to the intellectual enterprises of computer science and the art of programming. This course teaches students how to think algorithmically and solve problems efficiently. Topics include abstraction, algorithms, data structures, encapsulation, r

cs50.harvard.edu

 

부스트코스

 

다 함께 배우고 성장하는 부스트코스

부스트코스(boostcourse)는 모두 함께 배우고 성장하는 비영리 SW 온라인 플랫폼입니다.

www.boostcourse.org

 

CS50 IDE

 

CS50 IDE

integrated development environment for students and teachers

ide.cs50.io