wjdcldn1024   2년 전

문제점이 뭘까요..

도와두시면 감사하겠습니다!

some256   2년 전

소스 코드가 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에 설명된 바입니다.

preview


주석 56에 추가적인 설명이 나옵니다. 주석 56이 설명하는 예시가 정확히 check 배열입니다.

preview

check 배열은 automatic variable이고 trap representation을 가지게끔 초기화할 순 있으나 적절한 값을 저장하기 전 까지 해당 변수는 사용될 수 없습니다.

아마도 file scope에서 선언하면 자동으로 0 으로 채워주는 동작을 automatic variable도 같은 동작을 하리라 실수하신 것 같습니다. file scope에 선언된 변수는 마치 = { 0 } 한 것과 같다는 건 보장됩니다.

preview

추가적으로 file scope에 선언된 변수는 static storage duration이고 0 으로 전부 초기화되나 static storage duration의 초기화 순서에 대해선 알려진 바가 없습니다.

preview

some256   2년 전

깜빡하고 적지 못했는데 위는 C의 동작이고 C++은 또 전혀 다를 수 있습니다...

wjdcldn1024   2년 전

넘 감사합니다!!

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