매개변수와 자동변수(=지역변수)는 모두 스택( Stack )영역에서 관리한다.

프로세스는 최소 한개 이상의 쓰레드를 가지고 있다.

 

쓰레드가 사용할 수 있는 스택의 크기는 1MB 로 한정된다.

#include<stdio.h>
#include<string.h>

int main(void)
{
    char szBuffer[1024];
    strcpy_s(szBuffer, sizeof(szBuffer), "Hello world");
    printf("%s\n", szBuffer);
    
    return 0;
}

 

위와 같이 코드를 작성하고 돌리면 Hello world가 출력된다.

 

#include<stdio.h>
#include<string.h>

int main(void)
{
    char szBuffer[1024 * 1024];
    strcpy_s(szBuffer, sizeof(szBuffer), "Hello world");
    printf("%s\n", szBuffer);
    
    return 0;
}

 

위와 같이 코드를 작성하고 돌리면 Hellow world가 출력되지 않는다.

위 코드 2개의 다른점은 char szBuffer 배열의 크기인데, 아래는 1024 * 1024로 1MB로 스택의 크기를 넘어가버렸기 때문에 

Stack overflow 런타임 에러가 발생해 출력되지 않는 것이다.

 

Stack overflow 발생

 

Stack의 크기는 프로젝트 속성 - 링커 - 시스템에서 스택 예약크기를 수정해서 변경할 수 있다.

보통은 1MB 이면 충분하기 때문에 수정하지 않고 사용한다.

 

이처럼 Stack의 크기는 한정적이기 때문에 유의하면서 사용해야 한다. 

  • 용량이 큰 구조체 자체를 매개변수로 전달할때 값 복사가 일어나지 않게 해야함
  • 함수가 다른 함수를 호출할때, 호출이 얼마나 이어지는지도 생각해야함

 

+ Recent posts