jhwan818   4년 전

**문제는 이미 해결을 했습니다. 단지 함수 리턴값으로 포인터를 쓸때 어떤 문제가 생기는지 궁금해서 질문 남겼습니다.**


문제를 풀면서 분명히 코드는 맞는데 런타임 에러가 뜨길레 한참을 고민했습니다.

배열 인덱스 범위를 벗어나는것도 아니고 불필요한 재귀함수가 들어가는 것도 아니어서 한참 해메다가.

int* rnum = IsFull(x, y); 이 부분이 너무 어색해보였습니다. 괜히 포인터를 써서 문제가 생긴건 아닐까?

그래서 과감하게 IsFull(x, y)함수랑 int* rnum를 제거하고.

int num[9] = { 0, };
while (rnum[pos] != 0 && pos < 9) {
num[pos] = rnum[pos++];
}

요 부분처럼 쓸대없이 배열을 하나 더 만들어서 간접적으로 자료를 저장하는 것이 아닌.

그냥 바로 int num[9]에다가 직접 자료를 저장했습니다. 해결이 되더군요. 포인터를 이상하게 썻나봅니다.

뭔가 문제가 있다는 건 알겠는데 무슨 문제가 있었는지 도통 모르겠습니다.

아래에 틀린 소스와 맞은 소스 변화를 준 부분만 따로 따왔습니다. 능력자분들 도와주세요.

bupjae   4년 전

틀린 소스에서 rnum 은 함수 IsFull 이 실행되고 있는 경우에만 살아있는 변수입니다.

함수 IsFull 이 종료되는 순간 rnum 은 사라집니다.

sdoku 에서는 사라져버린 rnum 을 가리키는 포인터에 접근하려고 했기 때문에 오류가 발생합니다.

bupjae   4년 전

참고로, 이런 식의 잘못된 포인터 사용은 흔히 발생하기 쉽고, 일단 발생하면 거의 항상 잘못된 결과가 나오기 때문에

대부분의 컴파일러는 이런 실수가 있었다는 것을 프로그래머에게 알려줍니다.

예를 들어, 제가 사용하는 (온라인) 컴파일러에서는 아래와 같이 경고 메세지를 출력합니다.

jhwan818   4년 전

오홍 감사합니다 덕분에 새로운걸 알아갑니다!

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