본문 바로가기
C

[C] 스택 메모리, 매개변수 배열

by imagineer_jinny 2022. 2. 27.

본 내용은 POCU COMP2200: C 언매니지드 프로그래밍 강의를 토대로 작성하였습니다.

 

  • 스택(stack) 메모리
    • 우선 자료구조인 스택이랑 헷갈리지 말 것
      • 둘 다 작동방법이 동일해서(LIFO) 스택이란 이름을 쓸 뿐
    • 각 함수에서 사용하는 지역 변수 등을 임시적으로 저장하는 공간
    • 스택 메모리의 크기는 프로그램 빌드 시에 결정됨
    • 스택 메모리의 위치는 실행 시에 결정됨

 

  • 기본 자료형 변수는 스택 메모리를 차지!
    • 여태까지 모든 기본 자료형 변수(char, int, float)를 new 없이 사용할 수 있었던 이유가 바로 스택 메모리에 할당됐기 때문
    • 기본 자료형을 함수 매개변수로 전달하면 스택에 복사본을 만듦 -> 이게 바로 값형
    • 스택 메모리를 빌리고 반환할 때마다 언제나 빈 공간 없이 차곡차곡 쌓여 있음
    • new로 만든 데이터는 힙(heap) 메모리에 할당됨
      •  이 경우 메모리에 구멍이 뚫릴 수 있음

 

  • 스택 메모리에 대해서 간단히 알아보자
    • ESP + EBP = 스택 프레임
    • 배열도 스택 메모리에 들어감

 

  • 스택의 크기는 한정적이지 않나요?
    • 맞음
    • 당연히 타겟 플랫폼 따라 달라짐
    • 심지어 프로그래머가 컴파일 시 스택의 크기를 정해줄 수도 있음
    • clang windows에서 아무 것도 안 정해주면 대략 1MB 정도

 

  • 스택이 터진다~ 스택 오버플로
    • 스택의 크기가 약 1MB일 때, 이런 코드를 실행하면 곧바로 스택 오버플로 남

 

  • 너무 큰 데이터는 스택에 넣으면 안 됩니다
    • 따라서 너무 큰 데이터를 사용할 때는 스택에 넣을 수 없음
    • 이럴 경우에 사용하는 것이 동적 메모리 할당(C#에서는 new를 사용)
      • OS에게 메모리 달라고 부탁하는 것

 

  • 배열의 요소 개수 구하는 방법
    • sizeof(values)는 values 배열이 차지하는 총 바이트 수를 반환
    • 그 이유는?
      • 이 배열이 스택에서 몇 바이트를 차지하는지 컴파일 중에 알기 때문  
int values[30];
size_t array_size = sizeof(values); //120

 

 

  • 함수의 스택 메모리 사용량은 고정
    • 함수는 호출자가 누구든 간에 딱 정해진 수와 크기의 매개변수가 들어온단 가정으로 동작
    • 함수가 먼저 결정되고, 호출자는 그 함수를 호출할 뿐
    • 즉, 함수는 호출자가 뭐하는 놈인지 모름

 

  • sizeof(매개변수)가 4를 반환한 이유는?
    • 따라서 배열을 매개변수로 전달할 때는 실제 모든 요소를 스택에 넣지 않음
    • 그 대신 그 배열의 시작 위치(주소)를 스택에 넣어줌
      • 이 주소 크기 = 포인터 데이터형의 크기
      • 32비트 플랫폼에서는 4 바이트, 64비트에서는 8바이트
      • 그래서 sizeof()를 하면 4바이트가 나온 것

 

 

 

댓글