hyeok5596   2달 전

인터넷에서 퍼온 코드입니다.

main 함수에서 입력받는 부분의 코드만 한번 봐주시면 되는데


arr[a] << 이렇게 작성 했는데 배열의 인덱스 범위를 초과하지 않고 에러도 안뜨고

잘 실행되는 이유가 궁금합니다.

a = 'A' 라고 하면 A는 아스키코드에 따라 65인데

arr[a]는 arr[65]를 의미하게 되서 문제가 생기는게 아닌가 싶은데 왜 문제가 발생하지 않는지 궁금합니다.

dldyddlwl   2달 전

비주얼 스튜디오에서 보면, 바로 인덱스 초과 경고를 띄워줍니다. 

배열의 인덱스를 초과하는 것은 사실은 undefined behavior라고 부릅니다. 즉, 어떻게 될 지 모른다는 것이죠. 만약, 중요한 메모리 부분을 건드리지만 않는다면,

에러를 발생시키지는 않을 것입니다. 트리순회 예시를 입력받고, 그대로 출력해보면, 아래와 같이 나옵니다.

[입력]

7
A B C
B D .
C E F
E . .
F . G
D . .
G . .
[출력] i = 0 부터 'Z'까지

// 배열의 범위까지는 입력받은 게 없으므로 출력 없음

// 계속 비어있는 값들 ...


    

$    // 입력받은 적도 없는 뜬금없는 값, 배열의 범위를 벗어나 다른 메모리 공간에 접근했다는 것을 보여줌



// 비어있는 값들
// ...


B C // 실제로 받은 값들
D .
E F
. .
. .
. G
. .

hyeok5596   2달 전

위의 설명하신 3줄은 이해했습니다.

근데 그 아래부터 설명 해주시려는게 죄송하지만 무슨 말씀이신지 모르겠습니다.

다시 설명해주실 수 있을까요?

dldyddlwl   2달 전

실제로 인덱스를 초과했는지 안 했는지 확인해보기 위한 출력예시였습니다.

문제에 나온 예시를 입력하고, 바로 출력해보면요

i = 0부터 i = 26까지는 비어있습니다. (실제 인덱스 범위 내, 왜냐하면 입력받은 것이 없기 때문에 )


하지만 i = 0부터 i = 'Z' 까지 출력을 해보면 실제로 입력받았던, arr['A']와 같은 값들이 나오기 시작합니다!


그런데 제가 말씀드리고 싶었던 것은, 이렇게 출력하다보면, 갑자기 이상한 값들이 같이 찍혀나온다는 것입니다.


만약에, 인덱스 초과가 아니었다고 가정한다면, 입력받은 것 이외의 값이 출력이 될리가 없겠죠. ( 전역변수로 선언되어 모두 0이기 때문에, 입력 이외의 값이 0이 아닐 수 없음 )

하지만 인덱스를 초과했기 때문에, 다른 메모리 영역에 접근해서, 이상한 값들이 함께 나오는 것입니다.


다시 말하자면, 인덱스를 초과했다는 것은 코드만 봐도 알 수 있지만, 실제로 인덱스를 초과해서 다른 메모리까지 접근했다는 것을 눈으로 확인하기 위해서 출력해보았습니다.

hyeok5596   2달 전

감사합니다!

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