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

pipopin z님의 프로필 이미지
pipopin z

작성한 질문수

문제로 배우는 C언어

주사위 합

38.자리 찾기문제에서 배열의 크기에 질문이 있습니다.

작성

·

521

0

int arr[] 배열 선언할때 main 함수 바깥 맨위에서 선언을 하면

int arr[2]; 처럼 아무리 작은 크기로 배열을 선언해도

7

11 15 19 23 27 32 36

21

콘솔에서 이런식으로 배열크기를 초과하는 입력을하면 

11 15 19 21 23 27 32 36 출력되서 정상작동되는데 그 이유가 궁금합니다. main 함수안에서 int arr[] 배열을 선언하면 그렇게 나오지가 않습니다.

그리고 arr 배열을 main함수 안에서 int arr[4];라고 선언하고  입력예제 

5

1 3 7 9 15

8

를 입력하면 출력이 정상적으로 되는데 애초에 선언된 크기인 arr[4]를 넘어가는 입력이 들어왔는데 어떻게 '1 3 7 8 9 15 '   6개의 숫자가 정상출력되는데 이유가 궁금합니다. 그리고

int arr[7];라고 선언하고 입력예제

7

11 15 19 23 27 32 36

21

하면 이건 또 출력이 정상적으로 되지않습니다. 이 경우에는 할당된 배열크기가 작아서 출력이 선언된 배열크기를 넘어가 제대로  출력 안된다고 생각이 되는데 왜 저 int arr[4]인 경우에는 할당크기를 넘어가는데도 출력이 정상적으로 되는지 이해하기가 어렵습니다.

답변 1

0

김태원님의 프로필 이미지
김태원
지식공유자

C 컴파일러는 배열의 index out of range 에러를 잡지 못합니다. 배열의 인덱스가 할당 범위를 벗어나도 일정 양은 벗어난 범위의 메로리에 값을 할당합니다. 즉 기본적으로 C언어는 프로그래머가 index out of range 에러를 철저히 조심해야 합니다.

배열을 main 함수 밖에 전역으로 선언하면 메모리의 데이터 영역에 할당되며 메모리의 크기가 여유롭게 잡힙니다. 하지만 main 안에 지역변수로 선언하면 메모리의 스택영역에 할당되며 크기가 작아 여유공간이 없습니다. 

알고리즘 대회에서 이런 index out of range를 조심하지 않아 낭패를 보는 학생들이 많습니다.  자신의 컴퓨터에서는 정상적으로 답이 나와 채점서버에 올리면 채점서버도 에러를 내지 않지만 어뚱한 답을 출력합니다. 즉 컴퓨터에 따라 각양각색입니다. 그러므로 애초에 프로그래머가 index out of range 에러를 조심해야 합니다.

pipopin z님의 프로필 이미지
pipopin z

작성한 질문수

질문하기