인프런 커뮤니티 질문&답변

toyboy0113님의 프로필 이미지

작성한 질문수

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버

달팽이 문제

"board에 쓰는 동안 버퍼 오버런이 발생했습니다"

23.10.11 19:28 작성

·

548

·

수정됨

0

안녕하세요 달팽이 문제를 푸는데 답은 잘 나옵니다
그런데 SetBoard함수의 board[y][x] = i
이 부분에서 "board에 쓰는 동안 버퍼 오버런이 발생했습니다"라는 경고가 나옵니다
이러한 경고가 왜 뜨는지와 이 경고를 해결하려면 어떻게 코드를 수정해야 하는지 알 수 있을까요?

코드링크:
http://boj.kr/d69d82f1e84c49da942ec7948ab48529

답변 2

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2023. 10. 14. 17:14

버퍼 오버런은 말 그대로 영역 밖까지 접근한 것인데요.
int arr[10]인데 arr[10]을 사용하면 원래 잘못된 영역에 접근한 것이겠죠.

for (int i = 1; i <= N * N; i++)

{

board[y][x] = i;


이 부분이 의심스러운데 board[MAX][MAX]에서 MAX가 N이기 때문에
MAX+1로 하거나 인덱스를 i=0에서 i < N*N로 한다거나 조정이 필요합니다.

0

인프런 AI 인턴님의 프로필 이미지

2023. 10. 13. 19:31

안녕하세요, 인프런 AI 인턴이에요.

“board에 쓰는 동안 버퍼 오버런이 발생했습니다” 경고는 배열 범위를 벗어나서 메모리를 침범하고 있다는 뜻입니다. 버퍼 오버런은 다른 메모리 영역까지 침범하여 예기치 않은 동작이 발생할 수 있으므로 주의해야 합니다.

코드를 살펴보니 SetBoard 함수에서 다음과 같은 부분에서 버퍼 오버런 경고가 발생하고 있습니다.

board[y][x] = i

이 코드는 2차원 배열 board의 (y, x) 인덱스에 값을 저장하는 코드입니다만, 배열의 크기 범위를 벗어나기 때문에 경고가 발생하고 있습니다.

버퍼 오버런 경고를 해결하기 위해서는 배열의 크기를 체크하고 예외 처리해야 합니다. 그리고 배열 크기를 벗어났을 때 어떤 동작을 할지 결정해야 합니다.

예를 들어, board의 범위를 확인하고 범위를 벗어난 경우에는 값을 저장하지 않도록 처리할 수 있습니다. 아래는 예시 코드입니다.

def SetBoard(board, y, x, i):
    if 0 <= y < len(board) and 0 <= x < len(board[0]):
        board[y][x] = i
    else:
        # 처리할 동작 작성 (예: 경고 메시지 출력)
        print("올바른 범위를 벗어났습니다.")

위의 코드처럼 배열의 범위를 확인하고 예외 처리를 하면 버퍼 오버런 경고를 해결할 수 있을 것입니다.

하지만, 제공해주신 코드링크를 확인해볼 수 없는 상황이므로 정확한 해결을 위해서는 코드를 직접 확인해야합니다. 코드에 문제가 있을 경우에는 코드 전체를 함께 공유해주시면 조금 더 구체적인 도움을 드릴 수 있을 것입니다.

참고로, 버퍼 오버런 경고가 발생하는 경우 배열 범위를 체크하고 예외 처리하는 것이 좋지만, 코드 전체를 확인해보고 개선할 수 있는 부분이 있는지 고려해야 합니다.