ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CS50 코칭스터디] CS50 코칭스터디2기_5주차
    CS50 코칭스터디2기 2021. 2. 19. 18:28

    5주차_메모리와 포인터

    메모리의 구조

    프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 합니다.

    또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요합니다.

     

    따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있습니다.

    프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같습니다.

     

    코드(code) 영역

    메모리의 코드(code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부릅니다.

    CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.

     

    데이터(data) 영역

    메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역입니다.

    데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.

     

    스택(stack) 영역

    메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역입니다.

    스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.

    이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다.

     

    힙(heap) 영역

    메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역입니다.

    힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다.

    힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.

     

     

    포인터

    포인터란 변수를 저장하는게 아닌 변수의 주소를 저장하는 것입니다. 

    * 연산자를 사용해서 변수의 메모리 주소에 있는 값을 받아올수 있습니다. 

    그리고 포인터의 크기는 모두 같은 크기를 가집니다. 

    예를 들어 char*, int*, float* 등 모든 포인터 자료형들은 같은 크기를 가지고 있습니다. 포인터는 그저 주소 값을 저장하는 자료형으로, 메모리의 크기와는 관계가 없습니다.

    16-bit 컴파일러는 16bit 주소로 이루워져 있으므로 포인터의 크기는 16-bit (2 byte)이며, 32-bit 컴파일러는 32-bit 주소로 이루워져 있으므로 포인터의 크기는 32-bit (4 byte)입니다

     


    5주차 팀미션 

    1) 수업에서 언급되었던 Heap overflow와 stack overflow에 대해서 어떤 경우에 발생이 되는지 서술해주세요.

    heap: 동적 변수를 저장하는 데 사용되는 메모리 영역. 힙 영역에는 malloc으로 할당된 메모리의 데이터가 저장된다.
    heap overflow: 힙 데이터 영역에서 발생하는 메모리를 다루는 데 오류가 발생하여 잘못된 동작을 하는 버퍼 오버플로의 한 종류

    heap overflow는 두 가지 경우에 발생한다.
    1. 메모리를 지속적으로 할당하고 사용 후 해당 메모리 공간을 해제하지 않으면 메모리 누수 문제가 발생하고 heap overflow가 발생한다.
    2. 많은 수의 변수를 동적으로 할당하는 경우에도 heap overflow가 발생한다.

    stack: 함수 내에서 사용되는 지역 변수, 함수를 통해 전달된 매개 변수 및 반환 주소를 저장하는 데 사용되는 메모리 영역. 스택에는 프로그램 내의 함수와 관련된 것들이 저장된다.
    stack overflow: 스택 데이터 영역에서 스택 포인터가 스택의 경계를 넘어설 때 일어나는 버퍼 오버플로의 한 종류

    stack overflow는 두 가지 경우에 발생한다.
    1. 프로그램이 많은 수의 지역 변수를 선언하거나 배열 또는 행렬 또는 큰 크기의 배열을 선언하는 경우에 stack 크기보다 더 많은 메모리 공간을 사용하면 stack overflow가 발생한다.
    2. 함수가 반복적으로 자신을 무한히 호출하면 stack은 모든 함수 호출에서 사용되는 많은 수의 지역 변수를 저장할 수 없고, 이 때도 stack overflow가 발생하게 된다.

     

     

    2) Strcpy와 strncpy의 차이점을 서술해보세요. (어떤 것을 추천하는지와 그 이유에 대해서 서술해주세요.)

    - strcpy (= string copy):
    사용법: char * strcpy(char * dest, const char * src) / dst : destination, src : source
    기능: stc 문자열을 dst 버퍼에 복사, 저장한다.
    경우: sizeof(src) 길이 만큼 복사하게되는데 sizeof(dest) 값이 sizeof(src) 보다 같거나 커야하며 작으면 에러가 발생한다.

    - strncpy (= string new copy):
    사용법: char * strncpy(char * dest, const char * src, size_t n)
    기능: 문자열 복사라는 기능은 strcpy와 동일하지만 src 문자열을 얼마나 복사할지 n값으로 지정 → n 값을 10 으로 설정하면 src 주소부터 10글자만 복사한다.
    경우: src문자열의 길이만큼 dst 버퍼에 저장하기 때문에 src 문자열의 길이가 제한되므로 버퍼 오버플로우에 있어서 안전하다.

Designed by Tistory.