지뢰찾기
, 허 가은님이 작성자꾸 HEAP CORRUPTION DETECTED 오류가 뜹니다. 뭐가 문제일까요?
메모리 프리선언을 안 하면 제대로 돌아가는데, 심사를 통과하지 못합니다.
char** matrix = malloc(sizeof(char*) * m);
for (int i = 0; i < m; i++) // 세로 크기만큼 반복
{
matrix[i] = malloc(sizeof(char) * n); // (int 크기 * 가로 크기)만큼 동적 메모리 할당.
}
memset(matrix, 0, 1);
(도장_ 관리자님이 수정함 - 원문 제출일: 2020년 5월 12일, 화요일, 오후 9:03)
Re: 지뢰찾기
, 도장_ 관리자님이 작성힙 오염 발견은 malloc으로 할당한 메모리 사용이 올바르지 않기 때문입니다.
앞에서 학습했지만, 문자열은 끝에 널 문자가 자동으로 붙습니다. 사람의 눈에는 안 보이지요.
그래서 문자열 "Hello"를 입력받으면 실제 내부에는 Hello + \0(널 문자)가 저장됩니다.
Hello 5글자를 저장하는 데 필요한 메모리 공간은 5바이트가 아니라 널 문자를 포함한 6바이트가 되는 이유입니다.
행렬 데이터도 문자열로 입력 받고 있으므로 널 문자가 들어갈 공간까지 초기화해야 합니다.
3x3 행렬일 때 행에는 3바이트가 아니라 +1바이트가 추가되어야 합니다. 즉, 4바이트 할당이 필요합니다.
이에 대해서는 심사문제 해설에 설명되어 있습니다. 재인용하면...
그리고 m만큼 반복하면서 가로 공간(열)에 해당하는 메모리를 할당합니다. 이때 가로 공간에는 문자열이 저장되므로 NULL까지 들어갈 수 있도록 가로 크기 + 1(n + 1)크기만큼 메모리를 할당합니다('Unit 39 문자열 사용하기', 'Unit 40 입력 값을 문자열에 저장하기' 참조).
메모리 초기화가 이상합니다.
UNIT 35.3을 보면 memset 사용법이 있습니다.
memset(matrix, 0, 1);
이 코드는 matrix에 할당한 전체 공간 중에 1바이트만 0으로 초기화한다는 뜻입니다.
전체 공간을 초기화해야 하므로 for 반복문 안에서 각 행에 malloc으로 할당한 크기만큼 초기화를 해줘야 합니다.
1바이트만 0으로 초기화하면 나머지 공간은 쓰레기 값이 그대로 들어 있다는 뜻입니다.
문의한 코드는 입력
3 3
...
...
..*
...
...
..*
에 대해서 다음과 갈이 출력합니다.
심사문제는 텍스트 일치로 판단하기 때문에 빈 줄이 출력되지 않게 해야 합니다.
000 011 01*
힙 오염은 반드시 발생하면 안 되고, 해결해야 하는 버그입니다.
메모리는 malloc으로 할당했으면 free로 반드시 해제해야 합니다.