char 배열 선언시 최대값은 어떻게 되나요?

webper81의 이미지

이번에 freebsd 에서 컴파일 할 일이 생겨

실행파일을 실행 중

Segmentation fault 나서 원인을 찾아보니

배열의 선언에 있었습니다.

char buffer[65537] 이렇게 선언이 되어있었는데

그냥 프로그램이 죽어버리네요.

이렇게 큰 배열은 쓴적이 없는데 다른 사람이 한 프로그램이라서

쉽사리 건들지도 못하고 있습니다.

원인이 무었때문인지 아시는 분들은 도움 부탁드립니다.

lunarainbow의 이미지

전역변수 또는 malloc을 사용하여 보시기 바랍니다.

너무 큰 지역변수를 잡았기 때문입니다.

지역변수는 스택에 쌓이는데, 이 크기를 넘어섰기 때문입니다.

cbycby의 이미지

webper81 wrote:
이번에 freebsd 에서 컴파일 할 일이 생겨

실행파일을 실행 중

Segmentation fault 나서 원인을 찾아보니

배열의 선언에 있었습니다.

char buffer[65537] 이렇게 선언이 되어있었는데

그냥 프로그램이 죽어버리네요.

이렇게 큰 배열은 쓴적이 없는데 다른 사람이 한 프로그램이라서

쉽사리 건들지도 못하고 있습니다.

원인이 무었때문인지 아시는 분들은 도움 부탁드립니다.

너무 큰 배열을 써서 생기는 문제가 아니라 다른쪽에 원인이 있는것 같습니다.

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

int main()
{
    char buffer[65536];
    memset(buffer, 0, sizeof(buffer));
    return 0;
}

위 코드는, 제 컴퓨터에서 실행시 아무런 문제가 없습니다.
아래의 어떤분이 stack제한을 넘어서 그렇다고 하셨는데,
제가 알기로는
stack제한이 넘으면 자동으로 heap 에 할당하는것으로 알고 있습니다.

심지어
char buffer[20000000];
이렇게 선언해도 문제가 없습니다.
stack에 할당하는게 아니라 heap에 할당하기 때문에요...

문제의 내용으로 봐서는
여러 원인이 있겠지만,
buffer 배열의 인덱스 범위를 넘어가는 포인터 주소를 참조해서
발생되는 문제인것 같습니다.

http://www.korone.net QT 커뮤니티 사이트

dreamer의 이미지

제가 알기로는 stack에 할당하는 것으로 알고 잇는데..
스택 사이즈가 2k인가? 이부분은 좀 확실 하지는 않습니다만..
그러니까..
배열로 buf[10000]
이렇게 잡을수는 있어도 거기에 실제 데이타를 쓰면 죽을텐데..
음 한번 해봐야 할듯..

음 되는군요...??

rasungboy의 이미지

Quote:

심지어
char buffer[20000000];
이렇게 선언해도 문제가 없습니다.

돌려보면 Segmatation Fault 나옵니다.

윈도우에서는 스택오버플로우 에러메세지가 나오는데

리눅스에서는 그냥 다 Segmentation Fault 가 나오네요.

Quote:

제가 알기로는
stack제한이 넘으면 자동으로 heap 에 할당하는것으로 알고 있습니다

확실한건가요? 긴가 민가 하네 ^^;;

윈도우에서는 컴파일러가 스택사이즈를 예약할수 있던데

리눅스는 어떤지 잘 모르겠네요..

제가 보기에도 char buffer[65535]; 문제는 아닌듯 싶습니다..

다른곳에 문제가 있는것 같은데..

alwaysN00b의 이미지

Stack하고 heap사이에는 어떤영역이 있나요?

언제나 시작

lunarainbow의 이미지

cbycby wrote:

심지어
char buffer[20000000];
이렇게 선언해도 문제가 없습니다.
stack에 할당하는게 아니라 heap에 할당하기 때문에요...

문제의 내용으로 봐서는
여러 원인이 있겠지만,
buffer 배열의 인덱스 범위를 넘어가는 포인터 주소를 참조해서
발생되는 문제인것 같습니다.

너무 큰 변수의 선언에서, 선언이야 문제 없겠습니다만(컴파일 시에는 문제 없겠지만. 문법적으로는 이상이 없지만), 실행시켜 본다면 에러가 날 것입니다.

저도 가끔 배열 몇백만개 이상 잡을때가 있는데, 귀차니즘의 압박으로 그냥 전역변수로 빼버립니다. 한번쓰고 안쓸 프로그램인데.. 하구. :roll:

rasungboy wrote:

제가 보기에도 char buffer[65535]; 문제는 아닌듯 싶습니다..

다른곳에 문제가 있는것 같은데...

어젯밤에 쓸때는 무심코 썼는데, 다시 보니 숫자가 굉장히 작았었네요.

저도 윗분들 말씀처럼 버퍼 크기가 문제되지는 않으리라 생각이 됩니다.

ps. 괜한 말로 헷갈리게하여 죄송합니다. :oops:

cinsk의 이미지

먼저, 그런 큰 배열을 쓴다는 것 자체가 나쁜 프로그래밍 스타일입니다. malloc()을 써서 동적으로 할당하던지, 아니면 mmap을 써서 원하는 공간을 얻어서 쓰는 것이 좋습니다. 아니면 static으로 선언하는 것도 좋습니다.

둘째, 일반적으로 local variable들은 stack에 저장됩니다. Stack이 동적으로 크기가 변할 수 있는 시스템이 아닐 경우, 큰 배열을 쓰게 되면 stack overflow가 발생할 수 있습니다. 대부분의 UNIX 시스템은 stack이 동적으로 커지긴 하지만, 갑자기 많은 크기의 공간을 요구할 경우, 문제를 일으킬 수 있습니다.

세째, stack의 크기가 제한되어 있다고 하더라도 컴파일러가 이를 문제삼아 에러를 알려주지는 않습니다. 따라서 아무 경고 없이, 컴파일되는 경우가 많습니다.

네째, stack overflow가 발생할 경우, 꼭 "stack overflow"와 비슷한 에러를 발생시키는 것도 아닙니다. 아주 이상한? 결과 (동작할 수도 있고, 엉뚱한 에러를 낼 수도 있고)가 나올 수 있습니다.

다시 말하지만, 이유야 어떻든 그렇게 큰 배열을 쓰는 것은 바람직하지 않습니다.

체스맨의 이미지

webper81 wrote:

Segmentation fault 나서 원인을 찾아보니
배열의 선언에 있었습니다.
char buffer[65537] 이렇게 선언이 되어있었는데
그냥 프로그램이 죽어버리네요.

이 말씀이 사실이면 일단은 다른 분들이 언급하셨듯이, 스택
오버플로가 유력합니다.

스택이 필요에 따라 커지는 시스템도 있긴 하지만, 반드시
그것이 가능하리라고 예상할 수는 없는 일이구요.

아무튼 손 못댈 정도로 어려운 문제는 아닐 것 같은데요.
일단 char* buffer 에 malloc - free 해도 프로그램이 죽는지
살펴보면 될 것 같구요.

단순히 저 정도 크기면 대개는 문제가 없지만, 상황에 따라
호출이 깊어져서 저런 배열들이 스택에 쌓이면 문제가 발생할
수 있지요. 그래서 리커젼에 저런 배열은 좋지 않습니다.

Orion Project : http://orionids.org

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.