Visual Studio 6.0에서 C언어 정적할당시 오버플로에 대해서 질문이 있습니다.

Sift의 이미지

학교에서 공부를 하고있는데 visual studio 6.0 버전 stack allocation 에서 3.2 GB 에 해당하는 스텍 메모리를 예약해서 프로그램을 돌리는 것 까지는 되었습니다.
int 형 배열 1.6 GB의 양에 해당하는 배열까지는 메모리에 할당 받아서 쓸수 있는데. 3 GB 쯤 되는 양을 선언하니 프로그램 컴파일시 다음과 같은 오류가 발생합니다.
저는 굳이 정적할당으로 3.2GB에 해당하는 메모리를 할당 받아서 배열을 만들어 보고 싶은데 이 오류가 왜 발생하고 어떻게 하면 좋을지 질문 드리고 싶습니다.

p.s. 그리고 3.2 GB 에 해당하는 양을 stack allocation 으로 메모리를 예약해놓고 프로그램을 돌렸을때 가끔 프로그램이 켜지자마자 꺼지는 상황이 발생합니다.(그때는 그림과 같은 오류는 발생하지 않았습니다.)

File attachments: 
첨부파일 크기
Image icon 없음321.png148.89 KB
Image icon 없음123.png219.68 KB
라스코니의 이미지

답변은 아니고 궁금한 점이 있습니다.

- 왜 스택에 3.2GB 라는 데이터를 넣고 싶으신 지 (컴파일러나 머신을 갈구는 목적이 아니라면)
- 최신 Visual Studio 버전에서는 어떤 결과가 나오는지(Community 버전으로 얼마든지 테스트할 수 있으니까요)
- 그림을 보면 파일 사이즈가 무려 1 기가바이트가 넘는데 로딩시간도 상당할 텐데 고려하신 것인지
- malloc()을 쓰면 안되는 상황인지

답변이 아니라 죄송합니다. 테스트의 목적을 알아야 어느정도 답변도 드릴수 있을수 같아서요 ~

kukyakya의 이미지

- 그림을 보면 파일 사이즈가 무려 1 기가바이트가 넘는데 로딩시간도 상당할 텐데 고려하신 것인지

스택에 생성하는 변수는 파일 사이즈와 무관합니다.

라스코니의 이미지

함수 내부 변수 선언의 경우 그 값을 초기화하는 경우에는 사이즈에 영향을 주는 것을 알고 있는데 제가 잘못 알고 있는 건가요?

int main()
{
int large[100000000000];
}

int main()
{
int large[100000000000] = {0, };
}
는 파일 생성 크기가 좀 다르다고 알고 있습니다.

kukyakya의 이미지

환경에 따라 다르기는 합니다만 일반적으로 전역 변수의 경우에는 초기화 값이 있을 경우 .data 섹션에 초기화값이 들어가서 파일 사이즈가 커질 수 있지만 초기화 값이 없거나 0인 경우 .bss 섹션에 들어가서 실행 파일 크기와 상관 없습니다.

로컬 변수의 경우 런타임에 스택에 생성되기 때문에 따로 섹션에 들어가지는 않고 {1, 2, 3,}과 같은 initializer가 텍스트나 rodata 섹션에 들어갈 수 있기에 바이너리 사이즈에 영향을 주긴 합니다만 원소의 개수가 100000000개인 initializer를 사용할 경우는 거의 없겠죠.

int large[1000000];의 경우 stack에 공간만 할당하고 초기화하지 않지만, int large[10000000] = {0, };의 경우 대부분의 컴파일러가 memset으로 0으로 초기화하는 코드를 생성할 겁니다.

@ 상관이 없다는 표현은 잘못된 표현이었네요. '로딩시간에 영향을 미칠만큼 바이너리 크기를 증가시키지 않는다'라는 게 원래 의도였습니다.

Sift의 이미지

우선 저 프로그램은 제 필요에 의해서 만든 프로그램이 아닌 Overflow에 대해서 어디까지 가볼수 있는지에 대해 알아보고 싶어서 계속 늘려보고 있는 중 입니다.

ymir의 이미지

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 』

Sift의 이미지

좋은정보 정말 감사합니다! 영어로 적혀있어서 조금 어렵지만 작성자님이 얘기해주신 정보만으로도 정말 많은 도움이 되었습니다!.
앞으로도 잘 부탁드립니다 감사합니다!..

yeonpil_net의 이미지

!23456---1----+----2----+----3----+----4----+----5----+----6----+----7-2--+----8
"배웠다"는 "할 수 있다"의 동의어가 아니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.