티스토리 뷰

 

Run-Time Check Failure #2 - Stack around the variable '변수이름' was corrupted 오류 한방에 해결하기


C언어로 프로그래밍을 하다보면 아래와 같은 메시지가 나올 때가 있습니다.


Run-Time Check Failure #2 - Stack around the variable '변수이름' was corrupted


아래의 오류는 컴파일은 잘 되는데 실행할 때 발생하는 오류인데요.

해결방법을 연구해 보도록 하겠습니다.


아래 화면은 실제 위의 오류가 발생한 화면입니다.






원인은 무엇일까?



Run-Time Check Failure #2 - Stack around the variable '변수이름' was corrupted.


위와 같은 오류가 발생하는 원인은 무엇일까요? 


그 원인은 바로 포인터에 있습니다.


지역변수(배열 변수나 클래스 변수나 관계 없음)의 주소(포인터)를 이용해서 그 변수에 값 등을 기록하려 할 때, 실제로 선언된 크기(할당된 크기)보다 더 큰 타입으로 기록하려고 할 때 발생합니다.


이는 결국 지역변수 스택을 망가지게끔 합니다.



실제로 예제를 보면서 확인을 해볼까 합니다.




문제가 되는 예제를 보도록 하겠습니다



아래 코드의 실행결과는 위에 보신 화면과 같습니다.

소스를 한번 보도록 하겠습니다.



#include <stdio.h>

int main(void)
{
	char a;
	printf("숫자 입력: ");
	scanf("%d", &a);
	printf("아스키 문자 출력: %c\n", a);
	return 0;
}


위 소스를 보시면 char 형으로 변수 a를 선언한 후 scanf에서 int 형의 데이터를 받는 %d인자를 사용해서 데이터를 입력받고 있습니다. 


여기서 a는 크키가 1바이트인 char형으로 선언했는데요. scanf에서는 크기가 4바이트인 int형으로 데이터를 입력받고 있습니다. 이런 경우 Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted 가 발생하게 되는 것이지요.





문제가 되는 예제를 수정해 보았습니다


문제가 되었던 부분을 수정해 보도록 하겠습니다.



#include <stdio.h>

int main(void)
{
	int code;
	char a;
	printf("숫자 입력: ");
	scanf("%d", &code);
	a = (char)code;
	printf("아스키 문자 출력: %c\n", a);
	return 0;
}


어떤 변수를 사용할 때 정확한 타입으로 사용하는 버릇을 들이면 위와 같은 오류는 발생하지 않을 것 같습니다.


이런 오류로 고생하시는 분들이 없었으면 좋겠다는 마음으로 포스팅을 했는데요. 이만 마치겠습니다.^^

댓글