안녕하세요. 38.8 심사문제 지뢰찾기에 관해서 질문 드립니다.
visual studio에서는 예 대로 프로그램 실행이 되나, 심사할때는 "실행되지 않는 코드를 제출했습니다. 코드를 다시 확인 해주세요."라고 나옵니다. 뭐가 문제인지 몰라 질문드립니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int row, col;
int count;
scanf("%d %d", &row, &col);
// 메모리 할당
char** matrix = malloc(sizeof(char*) * row); // 배열 세로 메모리 할당
for (int i = 0; i < row; i++)
{
matrix[i] = malloc(sizeof(char) * col + 1); // 배열 가로 메모리 할당
}
// 0 초기화
memset(matrix, 0, sizeof(char)); // matrix가 가리키는 메모리를 char 크기만큼 0으로 설정
// 지뢰 위치 입력 받기
for (int i = 0; i < row; i++) // 지뢰 위치 입력 받기
{
scanf("%s", matrix[i]);
}
// 두번째 시도
// 지뢰 수 카운트
for (int i = 0; i < row; i++) // 세로 만큼
{
for (int j = 0; j < col; j++) // 가로 만큼
{
count = 0; // 카운트 초기화
if (matrix[i][j] == '*') // 지뢰라면
{
printf("*");
continue; // 지뢰 표시 후 for문 나가기
}
else // 지뢰가 아니라면
{
for (int y = i - 1; y <= i + 1; y++) // 한 칸 위부터 한 칸 아래까지 반복
{
for (int x = j - 1; x <= j + 1; x++) // 한 칸 앞(왼쪽)부터 한 칸 뒤(오른쪽)까지 반복
{
if (y < 0 || x < 0 || y >= row || x >= col)
{
continue; // 배열 범위를 초과한 것들, 예외사항
}
else if (matrix[y][x] == '*') // 주변 지뢰 카운트
{
count++; // 카운트 + 1
// 지뢰가 아니고, 지뢰가 주변에 없는 경우는 0으로 출력됨
}
}
}
printf("%d", count);
}
}
printf("\n");
}
// 메모리 해제
for (int i = 0; i < row; i++) // 세로 크기만큼 반복하면서
{
free(matrix[i]); // 2차원 배열의 가로 공간 메모리 해제
}
free(matrix); // 2차원 배열의 세로 공간 메모리 해제
return 0;
}
지저분하게 쓴 코드지만 ㅠㅠ 확인 부탁드립니다. 코딩도장 덕분에 열심히 배우고 있습니다.
*** Error in `/tmp/897914552/a.out': free(): invalid pointer: 0x00000000022b6000 ***Visual Studio에서 F5 키로 실행했을 때 결과는 나오지만,
for문을 이용해서 malloc으로 메모리 할당 해줬던 것처럼,
for문을 이용해서 memset 초기화 시켜주세요.
예 )
for(int i=0; i<row; i++){
memset(matrix[i], 0, sizeof(char)*col + 1);
}
이런식으로요 ㅎㅎ
**** 이렇게 안하고 작성자님처럼 더블포인터에 바로 초기화시켜주면, 더블포인터 안으로 들어가서 해당 값을 초기화시켜주는것이 아니라, matrix의 1차원배열들을 가르키는 포인터들을 초기화해주게 되는겁니다..