첨부한 소스 코드는 다른 분들의 학습을 위해 삭제했습니다.
(도장_관리자에 의해 편집됨 - 원문 제출일 2016년 11월 25일, 금요일, 오전 10:15 )
메뉴에서 디버그 > 디버깅 시작 또는 F5 키로 디버깅을 시작하고 테스트 케이스를 입력하면 결과를 출력한 후에 에러가 발생합니다.
디버깅 모드이므로 대화창에서 중단을 선택하면 화면 하단에 자동(Auto) 창이 뜹니다.
matrix[y]의 값을 읽을 수 없고, 메모리를 읽을 수 없습니다. 할당된 메모리의 범위를 벗어나서 값을 읽으려고 시도했기 때문입니다.
값을 보면 j = 0이고, x = -1입니다.
for (int x = j - 1; x <= j + 1; x++)
이 부분에서 int x = 0 - 1이 되어 x = -1이 됩니다.
따라서 값의 범위를 검사하는 부분이 적당한 위치에 추가되어야 할 것 같습니다.
65줄에도 중단점을 설정해서 i와 y 값이 적절한지도 검사해야 할 겁니다. matrix[y]의 값을 읽을 수 없는 것으로 보아 65줄에 중단점을 설정하면 i와 y 값도 문제가 있을 것 같습니다.(확인하지 않았지만, i = 0이고, y = -1이 되는 문제가 발생할 것 같습니다)
UNIT 6. 디버거 사용하기를 참조하세요. 동영상 강의를 통해 디버거 사용법을 익히면 문제 해결에 많은 도움을 얻을 수 있습니다.
감사합니다.
덕분에 예외처리관련을 다 해결한 것 같습니다 정말 감사합니다.
그런데 동적할당 해제 부분에서 HEAP CORRUPTION DETECTED 라는 에러가 뜹니다.
CRT detected that the application wrote to memory after end of heap buffer. 라는데
어느부분이 잘못된건지 알려주시면 정말 감사하겠습니다.
(도장_관리자에 의해 편집됨 - 원문 제출일 2016년 11월 25일, 금요일, 오후 2:39 )
문자들을 저장하면 끝에 널(NULL) 문자가 필요하기 때문에 그렇습니다.
n개의 문자를 담기 위한 배열을 할당할 때는 n+1만큼 할당해야 합니다.
또한, 할당한 이후에는 memset 함수로 초기화하는 습관을 갖는 게 좋습니다.
matrix[i] = malloc(sizeof(char) * n);
이 아니라
matrix[i] = malloc(sizeof(char) * n + 1);
로 하면 됩니다.
Unit 38을 검토한 결과 숫자 배열과 문자 배열의 메모리 할당의 차이를 설명하지 않았음을 발견했습니다. 문자 배열의 할당은 Unit 39부터 설명하고 있습니다. 따라서 Unit 38.8 지뢰찾기 문제에서는 '가로 크기 + 1'만큼 메모리를 할당해야 한다는 힌트를 추가하기로 했습니다.
따라서 Unit 38.8에는 다음과 같은 설명이 추가되었습니다.
행렬의 가로 공간에는 문자열이 들어갑니다. 따라서 메모리를 할당할 때는 가로 크기 + 1(n + 1)만큼 할당하여 NULL이 들어갈 공간까지 확보해야 합니다. 이 부분은 'Unit 39 문자열 사용하기'(515쪽), 'Unit 40 입력 값을 문자열에 저장하기'(527쪽)에서 자세히 설명하겠습니다.
감사합니다.