<문제>
https://codeup.kr/problem.php?id=1098
간단하면서도, 간단하지 않은 그런 문제였습니다. 풀던 중 저의 코드에서 예외가 발생하였는데요. 왜 그런가 살펴보겠습니다.
<예외 발생>
예외 발생(0x00007FF605141A50, Project1.exe): 0xC0000005: 0x00007FF60515B000 위치를 기록하는 동안 액세스 위반이 발생했습니다..
<에러가 발생한 코드>
#include<stdio.h>
int arr[100][100];
int main()
{
int w, h, n, l, d, x, y;
scanf("%d %d", &w, &h);
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d %d %d %d", &l,&d, &x, &y);
if (d == 0)
{
for (int j = y; j < j + l; j++)
{
arr[x][j] = 1;
}
}
else
{
for (int j = x; j < j + l; j++)
{
arr[j][y] = 1;
}
}
}
for (int k = 0; k < w; k++) {
for (int n = 0; n < h; n++)
{
printf("%d ", arr[k][n]);
}
printf("\n");
}
return 0;
}
위 에러가 발생한 이유는 할당되지 않은 메모리를 사용하려 해서 라고 생각하면 될것 같습니다.
아래 코드가 에러가 발생한 부분인데요!
for (int j = y; j < j + l; j++)
{
arr[x][j] = 1;
}
for문의 조건식 부분에 j < j+l과 같이 되어있습니다. 선언식 부분에서 j = y이고, 그러면 j+l 은 y+l이니, 무슨 문제가 있지 할 수도 있지만, j++이 되니 j < j+l 부분에서 j가 커지면 j+l도 같이 커지기에 < 부등호의 의미가 없어지게 됩니다. 즉 무한정 j++이 되어 결국 선언된 이차원 배열의 범위를 벗어나게 되는 것입니다.
그래서 코드를 아래와 같이 수정해주었습니다.
<Pass>
#include<stdio.h>
int arr[100][100];
int main()
{
int w, h, n, l, d, x, y;
scanf("%d %d", &w, &h);
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d %d %d %d", &l, &d, &x, &y);
if (d == 0)
{
for (int j = y; j < y + l; j++)
{
arr[x][j] = 1;
}
}
else
{
for (int j = x; j < x + l; j++)
{
arr[j][y] = 1;
}
}
}
for (int k = 1; k < w+1; k++) {
for (int n = 1; n < h+1; n++)
{
printf("%d ", arr[k][n]);
}
printf("\n");
}
return 0;
}