소스 코드가 undefined behaviour를 포함하고 있기 때문입니다. check 배열이 초기화되지 않았으므로 check 배열을 초기에 전부 false로 초기화하시면 잘 통과됩니다.
코드가 C 언어 스럽기도 하고 C++ 스럽기도 한데 C 언어라고 가정하겠습니다. check 배열은 초기화가 되어 있기 때문에 object representation이 bool 타입의 value를 표현하지 않을 수 있습니다. 이를 trap repesentation을 가진다고 말합니다. 이 때 bool 타입은 char 타입이 아니기 때문에 check 배열의 값을 lvalue expression으로 읽는 행위는 정의되지 않습니다. 참고로 bool이 설령 내부적으로 char로 표현되는 걸 선택할지라도 다른 타입입니다. 아래는 C 표준안의 Representation of types에 설명된 바입니다.
주석 56에 추가적인 설명이 나옵니다. 주석 56이 설명하는 예시가 정확히 check 배열입니다.
check 배열은 automatic variable이고 trap representation을 가지게끔 초기화할 순 있으나 적절한 값을 저장하기 전 까지 해당 변수는 사용될 수 없습니다.
아마도 file scope에서 선언하면 자동으로 0 으로 채워주는 동작을 automatic variable도 같은 동작을 하리라 실수하신 것 같습니다. file scope에 선언된 변수는 마치 = { 0 } 한 것과 같다는 건 보장됩니다.
추가적으로 file scope에 선언된 변수는 static storage duration이고 0 으로 전부 초기화되나 static storage duration의 초기화 순서에 대해선 알려진 바가 없습니다.
wjdcldn1024 2년 전 2
문제점이 뭘까요..
도와두시면 감사하겠습니다!