yw9594   4년 전

1406번 에디터 문제를 STL list를 사용해 해결하려고 하는 도중에 문제가 발생했는데요. 아래 코드는 문제가 발생한 부분을 요약해서 따로 작성해둔 코드입니다.

문제는 다음과 같습니다.

1) iterater 변수와 begin, end 주소를 동시에 출력하면 begin, end 값 중 하나의 값이 NULL 값이 반환됨.

2) begin과 end 값만 출력하면 정상 반환됨

아래 코드의 결과로 저는 아래와 같은 결과를 예상했으나..

00C2F490 0062F88C
00C2F490 0062F88C
00C2F490 00C2F490 00C2F7A0

실제 출력 결과는 다음과 같습니다.

00C2F490 0062F88C
00C2F490 00000000
00C2F490 00000000 00C2F7A0


이렇게 글로 써놓으니까 좀 횡설수설하는 느낌인데.. 아래 코드를 돌려보시면 무슨 말인지 이해가 가실겁니다.


왜 이런 현상이 발생할까요? 제가 STL list에 대해 좀 이해가 안된 부분이 있는걸까요?


bupjae   4년 전

list<char>::iterator 가 포인터라고 보장할 수 없습니다.

만약 포인터가 아니었다면, 포인터가 아닌 것을 %p 에 넘겼으므로 이 프로그램의 수행 결과는 정의되지 않습니다.

yw9594   4년 전

그렇군요 감사합니다!  그렇다면 %p에 대한 포맷 관련된 문제라고 한다면, 저 코드에서 printf("%p %p\n", iter, LL.end());의 결과값이 다르게 나오는 이유는 무엇일까요..? 이것 역시 수행 결과가 정의 되지 않아서 그런 것일까요..?

bupjae   4년 전

정의되지 않은 동작 (Undefined behavior) 을 하는 프로그램의 수행 결과는 예측이 전혀 불가능합니다.

printf가 엉뚱한 값을 출력할 수도 있고, 무한 루프에 빠질 수도 있고, 런타임 에러를 내뱉을 수도 있고, ......

구현체 마다, 또는 같은 구현체라도 컴파일 옵션에 따라 완전히 다른 결과를 받게 될 겁니다.

  

"결과값이 다르게 나오는 이유"를 따질 방법이 전혀 없습니다.

yw9594   4년 전

그렇군요 감사합니다. ㅠㅠ 큰 도움이 됐습니다 ㅎㅎ

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