Visual Studio 6.0에서 C언어 정적할당시 오버플로에 대해서 질문이 있습니다.
글쓴이: Sift / 작성시간: 월, 2016/03/21 - 2:47오후
학교에서 공부를 하고있는데 visual studio 6.0 버전 stack allocation 에서 3.2 GB 에 해당하는 스텍 메모리를 예약해서 프로그램을 돌리는 것 까지는 되었습니다.
int 형 배열 1.6 GB의 양에 해당하는 배열까지는 메모리에 할당 받아서 쓸수 있는데. 3 GB 쯤 되는 양을 선언하니 프로그램 컴파일시 다음과 같은 오류가 발생합니다.
저는 굳이 정적할당으로 3.2GB에 해당하는 메모리를 할당 받아서 배열을 만들어 보고 싶은데 이 오류가 왜 발생하고 어떻게 하면 좋을지 질문 드리고 싶습니다.
p.s. 그리고 3.2 GB 에 해당하는 양을 stack allocation 으로 메모리를 예약해놓고 프로그램을 돌렸을때 가끔 프로그램이 켜지자마자 꺼지는 상황이 발생합니다.(그때는 그림과 같은 오류는 발생하지 않았습니다.)
Forums:
답변은 아니고 궁금한 점이 있습니다. - 왜
답변은 아니고 궁금한 점이 있습니다.
- 왜 스택에 3.2GB 라는 데이터를 넣고 싶으신 지 (컴파일러나 머신을 갈구는 목적이 아니라면)
- 최신 Visual Studio 버전에서는 어떤 결과가 나오는지(Community 버전으로 얼마든지 테스트할 수 있으니까요)
- 그림을 보면 파일 사이즈가 무려 1 기가바이트가 넘는데 로딩시간도 상당할 텐데 고려하신 것인지
- malloc()을 쓰면 안되는 상황인지
답변이 아니라 죄송합니다. 테스트의 목적을 알아야 어느정도 답변도 드릴수 있을수 같아서요 ~
- 그림을 보면 파일 사이즈가 무려 1 기가바이트가
- 그림을 보면 파일 사이즈가 무려 1 기가바이트가 넘는데 로딩시간도 상당할 텐데 고려하신 것인지
스택에 생성하는 변수는 파일 사이즈와 무관합니다.
함수 내부 변수 선언의 경우 그 값을 초기화하는
함수 내부 변수 선언의 경우 그 값을 초기화하는 경우에는 사이즈에 영향을 주는 것을 알고 있는데 제가 잘못 알고 있는 건가요?
int main()
{
int large[100000000000];
}
과
int main()
{
int large[100000000000] = {0, };
}
는 파일 생성 크기가 좀 다르다고 알고 있습니다.
환경에 따라 다르기는 합니다만 일반적으로 전역 변수의
환경에 따라 다르기는 합니다만 일반적으로 전역 변수의 경우에는 초기화 값이 있을 경우 .data 섹션에 초기화값이 들어가서 파일 사이즈가 커질 수 있지만 초기화 값이 없거나 0인 경우 .bss 섹션에 들어가서 실행 파일 크기와 상관 없습니다.
로컬 변수의 경우 런타임에 스택에 생성되기 때문에 따로 섹션에 들어가지는 않고 {1, 2, 3,}과 같은 initializer가 텍스트나 rodata 섹션에 들어갈 수 있기에 바이너리 사이즈에 영향을 주긴 합니다만 원소의 개수가 100000000개인 initializer를 사용할 경우는 거의 없겠죠.
int large[1000000];의 경우 stack에 공간만 할당하고 초기화하지 않지만, int large[10000000] = {0, };의 경우 대부분의 컴파일러가 memset으로 0으로 초기화하는 코드를 생성할 겁니다.
@ 상관이 없다는 표현은 잘못된 표현이었네요. '로딩시간에 영향을 미칠만큼 바이너리 크기를 증가시키지 않는다'라는 게 원래 의도였습니다.
우선 답글 달아주셔서 감사합니다 ㅎㅎ..
우선 저 프로그램은 제 필요에 의해서 만든 프로그램이 아닌 Overflow에 대해서 어디까지 가볼수 있는지에 대해 알아보고 싶어서 계속 늘려보고 있는 중 입니다.
음 ..
https://software.intel.com/en-us/articles/memory-limits-applications-windows
windows 의 default stack size 는 1MB 입니다. (최대 1GB 까지 조절 가능한가 보네요)
그리고 32-bits 던 64-bits 던 static data 는 최대 2GB 까지입니다.
3.2 GB 를 할당 받고 싶으시면, 64-bits OS 에서 동적으로 할당해 줘야 합니다.
static, stack, heap 에 대한 내용은 아래 참조..
http://stackoverflow.com/questions/408670/stack-static-and-heap-in-c
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
정말 감사합니다!!
좋은정보 정말 감사합니다! 영어로 적혀있어서 조금 어렵지만 작성자님이 얘기해주신 정보만으로도 정말 많은 도움이 되었습니다!.
앞으로도 잘 부탁드립니다 감사합니다!..
MS 윈도우즈 문서를 참조하세요.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366778%28v=vs.85%29.aspx
!23456---1----+----2----+----3----+----4----+----5----+----6----+----7-2--+----8
"배웠다"는 "할 수 있다"의 동의어가 아니다.
댓글 달기