#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m, n;
scanf("%d %d", &m, &n);
char **matrix = malloc(sizeof(char *) * m);
for (int i = 0; i < m; i++)
{
matrix[i] = malloc(sizeof(char) * n + 1);
memset(matrix[i], 0, sizeof(char) * n);
}
for (int i = 0; i < m; i++)
{
scanf("%s", matrix[i]);
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (matrix[i][j] == '*')
continue;
else
matrix[i][j] = '0';
for (int y = i - 1; y <= i + 1; y++)
{
for (int x = j - 1; x <= j + 1; x++)
{
if (y < 0 || x < 0 || y >= m || x >= n)
continue;
if (matrix[y][x] == '*')
matrix[i][j] += 1;
}
}
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d", matrix[i][j]);
}
printf("\n");
}
for (int i = 0; i < m; i++)
{
free(matrix[i]);
}
free(m);
return 0;
}
문의한 코드를 실행하면 결과는 다음과 같습니다.
3 3
...
...
..*
484848
484949
484942
출력을 보면 원하는 결과가 나오지 않습니다.
000
011
01*
이와 같은 출력이 나와야 합니다.
Visual Studio에서 실행했을 때 이와 같이 실행이 중단됩니다.
리눅스 환경에서는 segmentation fault 에러, 즉 메모리와 관련된 에러가 발생하고 프로그램 오류로 종료됩니다.
Visual Studio에서는 디버거로 실행했으니 현재 내부 변수의 값을 보여줍니다.
변수 matrix는 오염되어 있다는 것을 알 수 있습니다.
free(m)인데, m은 타입이 int라고 표시되어 있습니다. 즉, free 함수에 쓸 수 있는 동적할당된 메모리를 가리키는 포인터가 아닙니다.
왜 실행이 안 되는 게 아니라 잘못된 코드이기 때문에 실행이 되지 않는 것입니다. Visual Studio에서도 예외가 발생하면 제대로 된 코드가 아니라고 생각하면 됩니다.
UNIT 6 디버거 사용법을 참고해서 단계별로 실행해봐야 합니다.
하단의 실행창을 보면 matrix 안의 값이 오염된 것을 확인할 수 있고
Visual Studio에서 출력 결과도 값이 오염되어 있는 것을 알 수 있습니다.
즉, 포인터로 할당한 2차원 배열의 인덱스 조작이 잘못되었다는 뜻이고,
어떤 조건에서 인덱스 조작이 잘못되었는지 찾아내는 일부터 해야 합니다.
현업에서도 가장 자주 발생하는 버그이고, 자주 해결해야 하는 문제입니다.
free(m)이냐 free(matrix)냐는 부차적인 문제이고, 값의 오염부터 찾아야 합니다.
포럼 상단 오른쪽에 38.8로 검색하면 이전 질문과 답변을 모두 참고할 수 있습니다. 문제 해결에 도움이 되길 바랍니다.