jakeehoson   3년 전

realloc시 기존의 포인터를 free하고 새로운 포인터를 주는 것으로 알고 있습니다.

제 소스코드에서 어떤 이유로 double free 오류가 발생하는 지 알 수 있을까요?

제가 쓰는 온라인 IDE에서는 double free가 일어나지 않는데 채점 환경에서는 double free 런타임 에러가 발생합니다.

어떤 차이점 때문에 그런건가요?

bupjae   3년 전

realloc 사용법이 틀렸습니다.

예를 들어서 30번째 줄에서 tmp1 = realloc(relations[a].arr, sizeof(int) * (relations[a].count + 1)); 를 실행한 후에는 relations[a].arr 를 더 이상 사용할 수 없고, 대신 반환값인 tmp1 을 사용해야 합니다.

"올바른" 사용법은 relations[a].arr = realloc(relations[a].arr, sizeof(int) * (relations[a].count + 1)); 와 같은 형태 입니다.

jakeehoson   3년 전

감사합니다. 사용법을 착각하고 있었습니다.

군대라서 사정상 온라인 IDE을 사용하고 있는데 이곳 에서는 이상하게 오류를 내지를 않네요.

bupjae   3년 전

이 프로그램에서는 더 이상 사용할 수 없는 relations[a].arr 을 계속 사용하고 있으며, C언어에서는 이런 프로그램의 수행 결과는 정의할 수 없습니다. (Undefined Behavior)

런타임 에러를 내뱉으면서 프로그램이 종료되는 경우가 대다수이지만, 나중에 엉뚱한 결과값을 내뱉을 수도 있고, 심지어 의도한 대로 잘 동작하는 것 처럼 보일 수도 있습니다.

C 구현체에 따라, 심지어 같은 구현체라도 컴파일 플래그에 따라서, 결과는 전혀 다르게 나올 수 있습니다.   

jakeehoson   3년 전

답변 정말 감사드립니다 

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