wksms21   4년 전

5번줄에서

short a[100001][2]; 

여기서 2를 3으로 바꾸면 정상동작하는데 왜그러는지 도저히 모르겠습니다 도와주세요ㅠㅠ

dotorya   4년 전

short형 변수를 %d로 입력받은 게 문제인 것 같습니다.

N = 100000인 경우에 메모리 영역을 침범할 수 있을 것 같아요

wksms21   4년 전

3인 경우는 왜 정답인지 알수있을까요?ㅠㅠ

wksms21   4년 전

메모리 영역 침범은 어디서 일어나는것인가요?ㅠㅠ

dotorya   4년 전

%d는 int형 변수에 값을 입력받는 방법이기 때문에, 입력으로 들어온 주소값에서부터 4byte만큼의 범위에 입력을 받아 값을 변경합니다.

short형의 a[100001][2]; 에 입력을 받는다고 하면, 이것은 2*100001*2 = 400004byte에 해당하는 메모리 영역이 할당되어 있을 것이고,

a[100000][1]의 주소값은 400002byte에 해당하는 위치가 되겠죠.

따라서, scanf("%d", &a[100000][1]);로 입력을 받는다면 400002~400006byte 범위에 입력을 받습니다.

a 배열을 400004byte까지만 할당되어 있으므로, 여기서 메모리 침범이 발생할 수 있습니다.

a[100001][2]; 대신 a[100001][3];으로 선언하신 경우, 메모리 영역은 600006byte까지 할당되어 있고, a[100000][1]의 주소값은 600002byte에 해당하는 위치가 되어,

600002~600006byte 범위에 입력을 받아 정상적으로 처리됩니다.

wksms21   4년 전

아하~ 그렇군요. 정말 감사합니다. 많은 도움이 되었습니다!!!

댓글을 작성하려면 로그인해야 합니다.