minu0122   5년 전

https://www.acmicpc.net/source...  이와 같은 코드가 통과하기에 k보다 큰 동전의 가치가 주어지지 않는다고 생각하였는데(18번째 줄에서 어레이의 크기를 벗어난 곳의 값을 바꿈)

4 15

1

5

12

100

컴파일러에서 문제가 안되는지 이러한 경우가 잘 돌아가더군요(이 이유는 저도 잘 모르겠습니다...) https://ideone.com/ZHLqNF

하지만

4 15

1

5

12

10000

이러한 테스트 케이스는 다른 온라인 컴파일러에서도 오류가 뜨는것 같습니다. https://ideone.com/IZDvyZ

이 글은 데이터 추가요청이자 질문인데 혹시 첫번째 테스트케이스에서 분명 어레이의 범위를 넘어갔는데 런타임에러가 안뜨는 이유를 알려주실 수 있나요?

djm03178   5년 전

C/C++은 배열의 인덱스 검사를 하지 않습니다. 배열의 인덱스라는 것은 단순히 배열의 시작 주소로부터 해당 인덱스만큼 떨어진 메모리 위치에 접근한다는 뜻입니다. 만일 이 위치가 우연히도 프로그램에게 허용된 주소였다면 에러가 당장 나지는 않습니다. 일반적으로 메모리는 프로그램에게 연속된 위치에 할당되므로 이런 현상이 빈번하게 나타납니다.

또한 운영체제는 메모리 할당을 요청받은만큼만 칼같이 할당해주는 것이 아니라 블록 단위로 주기 때문에 인덱스를 조금 넘어서더라도 여전히 에러는 안 나는 범위에 속할 수 있습니다.

minu0122   5년 전

그렇다면 시스템에 따라서 

4 15

1

5

12

100

이런 케이스도 에러가 날 수 있고

4 15

1

5

12

10000

이런 케이스가 에러가 안나고 잘 될 수도 있는 건가요?

djm03178   5년 전

네, 정말 알 수 없습니다.

minu0122   5년 전

그렇군요, 감사합니다~!

댓글을 작성하려면 로그인해야 합니다.