티스토리 툴바

달력

012012  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  



Run-Time Check Failure #2 - Stack around the variable 'n' was corrupted. 오류

"Run-Time Check Failure #2 - Stack around the variable 'n' was corrupted."라는 메시지가 나타났다다른 컴파일러를 이용하면  작동하던 프로그램이었기 때문에 더욱  당황하게 되었다원인은 무엇일까 페이지를 찾아 보니 이것 때문에 고생한 사람들이 많았던 같다페이지  개가 넘는 검색 결과그런데 원인은 무엇일까?

원인은 포인터 문제다.

 지역 변수(배열 변수든 클래스 변수든 상관 없음) 주소(포인터) 이용하여  변수에 무엇인가를 기록하려고  타입 오류로 인해서 실제 변수에 할당된 크기보다  많은 부분에 기록하는 경우에 이런 오류 메시지가 나타난다. 결과적으로 지역변수 스택이 망가지는 것이다.

#include <cstdio>

const int MAX = 80;

int main()

{

        char word[MAX], n = 0, count = 0;

        FILE *in = stdin, *out = stdout;

        while (fscanf(in"%s"word) == 1) {

               if (sscanf(word"%d", &n) == 1)

                       count++;

        }

        fprintf(out"count = %d\n"count);

}

 

 위 프로그램은 공백으로 구별된 단어들을 읽고거기에 십진수로 시작되는 부분이 있는 단어들을 하나씩 세는 프로그램이다입력이 영어 단어와 십진 정수로만 되어 있다면십진 정수를 세는 프로그램이다소수가 입력으로 있으면  부분은 세지 않는다

사설이 길었지만  프로그램의 경우에 Visual Studio 2005에서 제목과 같은 오류가 발생한다.원인은 무엇일까? sscanf  뒤를 살펴보고 여러 코드를 삽입해 봐도 어떤 오류도 발견할 없다. if문의 안쪽에 word 출력하도록 고치면 문제의 원인을 조금은 파악할  있다. word제대로 출력되지 않기 때문이다.

 오류 메시지에 나온 대로 문제의 원인은 n이다여기서는 n 공간을 절약하기 위해서 nchar 타입으로 정했다그런데 sscanf에서는 n int 타입이라고 가정하고 n 값을 넣는다.따라서 n 범위를 벗어나서 값을 넣으려는 시도를 하는 것이다.

 포인터가 C 프로그램 오류 원인의 대부분이라고 하더니만정말 포인터의 무시무시함을 실감하지 않을  없다.

 다른 경우는 배열을 선언 (arr[10];) 배열에 저장할 공간에 배열 값보다 초과 되는 경우발생된다 할당된 공간보다  많은 부분에 기록할 경우 이러한 오류가 생겨난다.

출처 :  http://blog.daum.net/big11m/170 

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 그로치
태그 앞에 붙여 넣습니다. -->