동적할당시 배열의 값이 변하는 문제

지재민@Google의 이미지

재귀함수에 들어가면 스택이 점점 쌓이는걸로 알고 있고
동적할당은 힙영역이라고 알고있습니다.

스택이 계속 쌓이다가 힙영역에 들어가면 메모리 오버플로우가 생길텐데,
혹시 에러가 발생해도 프로그램이 종료되지않고 계속 실행되는 경우가 있나요?

동적할당한 배열(전역변수)이 재귀함수를 돌면서 값이 변하는데
어떤 이유로 이런 상황이 발생할 수 있는지 궁금합니다.

jic5760의 이미지

일단 재귀를 돌면서 그 안에서 무언가를 하고 메모리 값이 바뀌는데
너무 재귀를 많이 돌아버리면 당연히 지정된 Stack size을 초과해서 메모리를 쓰게 됩니다.
그럼 건들면 안되는 메모리 영역을 건들게 되죠..
비슷한 예?로 Buffer over flow도 뭐..비슷한..?뭐 그런 개념입니다.

Windows Visual studio 에서는 Stack을 넘어서면 오류를 띄우는 옵션이 있는걸로 아는데
컴파일러마다 달라서 오류 없이 그냥 돌다가 어디선가 잘못되서 자기 혼자 죽는 경우도 있습니다.

재귀 함수는 조심하고 꼭 최대 depth을 정해놓는 등 잘 설계해서 써야 합니다..

sea5727의 이미지

저는 아직 학생이라 학교에서 배운건 이론으로는 Stack 영역과 Heap 영역은 서로 증가하면서 만난다고 하지만

VS 윈도우 7 에서는 서로 증가하면서 멀어지는 구조더라구요. OS나 컴파일러마다 다르겠지만

꼭 만난다는건 아닌거같아요

전역변수를 저장하는 공간은 따로 있는걸로 알고있는데

그공간을 동적할당하면 어떻게 되는지 아래에 고수님들 답변하시겠죠 ㅎㅎ..

shint의 이미지

0.
학원. 직업학교. 기업. 전문대. 대학교. 카페. 동아리. 도서관. 서점. 책. 등에 문의하거나. 참고해보세요.

0.
재귀 호출 없는 함수 사용 방법이 있습니다.
https://drive.google.com/folderview?id=0B_788O9A9oekR1NzVWZ0b0p4YTg&usp=sharing
기능과 원리로 배우는 프로그램항목.zip
- 데이터
- test 재귀호출을 사용하지 않고. 모든 파일 폴더 경로 리스트박스에 보여주기

1.
배열 데이터의 범위를 넘을 경우. 오류가 발생합니다.

2.
예외 처리를 하지 않는다면. 혹은 하더라도.
if() 도 넘어가는 문제가 발생할 수 있습니다.

3.
메모리 릭'을 확인해보거나. 한줄씩 지워서 확인해보는 방법이 있습니다.

4.
그리고. 변수 뿐 아니라. 각 함수마다. 인자값. 리턴값. 오류값을 모두 확인해보셔야 합니다.

5.
꼬리 재귀 최적화(Tail-recursion Optimization)
https://kldp.org/node/153435#comment-612848

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=961173&ref=961173&page=1

6.
재귀 호출이 필요없는 Javascript 객체 보는 방법

<html>
<body id="main">
<STYLE type="text/css" media="screen">
<!--
.note
{
 background-color:#eab9b2;
 font-family:Arial Tahoma,sans-serif;
 font-size:10pt;
 font-size:12px;
 color:white;
 margin-left: 5em;
 margin-right: 5em;
}
-->
</STYLE>
 
<div id="divx2" class="note" on mouseover="" on mousedown="" 
 style='background-color:#eab9b2; color:black; width:500; height:100;
 border:solid; border-width:1; position:relative; left:0px; top:0px; z-index:-10000;
 font-size:12px;'
>
 테스트 divx2
</div>
 
<script language="JavaScript" type="text/javascript">
 var div2 = document.getElementById("divx2");            //객체 이름을 main으로 하면. 브라우저의 모든 객체가 보입니다.
 var ar_object  = new Array();  //객체 담는 배열
 var ar_data  = new Array();  //문자열 담는 배열
 var string;     //디버깅용 문자열 버퍼
 var find_object_cnt = 0;
 var timer_id_pop = null;   //타이머 ID
 //------------------------------------------------------
 //재귀 호출이 필요 없는 자바스크립트 객체 내용 보는 방법
 //------------------------------------------------------
 //오전 12:14 2013-09-26
 //만드는데 3시간 정도 걸림 ㅇ_ㅇ;;
 //출처 적어주셈. ㅡ_ㅡ;; <a href="mailto:knightofelf@hanmail.net" rel="nofollow">knightofelf@hanmail.net</a> 신우섭
 //이제 브라우저 객체를 찾아 볼 필요가 없다. 그냥 출력하면 된다.
 //XP SP1을 설치한 PC에서 IE6 로 테스트한 결과. 같은 익스플로어를 2개 띄운후 실행하면 종료되는 문제가 있었다.
 //IE6 문제인지... 자바스크립트 문제인지. 모르겠다. 그냥 다운된다. ㅇ_ㅇ;;
 //---------------------------------------------------------------------
 //이것에 이름을 shint 객체 디버거'라고 지어주마. C 버전도 있다. ㅇ_ㅇ;;
 //이 방식은. 하위 트리 검색이 적용되는 모든 방식에 적용 할 수 있다.
 //---------------------------------------------------------------------
 function fn_object_pop()
 {
  if(ar_object.length > 0)
  {
   //핵심
   find_object_cnt = 0;
   var obj = ar_object.pop();
 
   for(var key in obj)
   {
    //주석용
    var text = eval('key') + "-" + key.constructor + "<BR>";
    ar_data.push(text);
    if( obj[key] == "[object]" )
    {
     //주석용
     text = "[object] - " + obj[key] + " " + typeof(key) + "<BR>";
     ar_data.push(text);
     //핵심
     ar_object.push( obj[key] );
     find_object_cnt++;
    }
    else if( obj[key] == "null" )
    {
    }
    else
    {
     //주석용
     text = "key - " + obj[key] + " " + typeof(key) + "<BR>";
     ar_data.push(text);
     //핵심
     ar_data.push( obj[key] );
    }
   }
   //타이머 종료용
   if(find_object_cnt == 0)
   {
    clearInterval( timer_id_pop );
    for(i=0; i<ar_data.length; i++)
    {
     string += ar_data[i] + "<BR>";
    }
    div2.innerHTML = string;
   }
  }
 }
 //타이머 시작용
 ar_object.push( divx2 );
 timer_id_pop = setInterval( fn_object_pop, 10 );
</script>
</body>
</html>
 

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

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