tkdlxmcnrwp   4년 전

마지막에 메모리를 해제하는 free()부분들을 안넣으면

정상적으로 작동을하고 맞았다고 뜨는데

free()부분들을 넣으면

비쥬얼스튜디오에서는 정상작동을 하지만

제출하면 런타임에러가 뜹니다.

어떤 부분이 문제인지 알려주세요 ㅠㅠ

chogahui05   4년 전

아무래도 님께서 i, j를 들어오는 그대로 받으셔서 a[i][j] = a[j][i] = 1 이런 식으로 넣으시다 보니까..

arr = (int**)malloc(sizeof(int*)*n+1); 

arr[0] = (int*)malloc(sizeof(int)*n*(n+1)); <<This

This 부분에서 실제로는 n행 n+1열만큼의 배열을 생성하게 되고. (아마도 arr[0]을 가지고 2차원 배열처럼 쓰신 듯 싶은데요)

정점 번호는 1번부터 N번까지이기 때문에 i -> j가 N, x 꼴로 들어왔을 때 의도치 않게 index 벗어나겠네요..

이 부분 때문에, 실제로 arr[0]의 주솟값에 의도치 않게 덮어 씌워버리는 경우에 free(arr[0])을 해 버리면

arr[0]이 가리키는 주소는 실제로 할당이 된 공간이 아니기 때문에, free를 수행하면 Runtime을 뱉어버릴 거고요..

N행 M열의 2차원 배열은 보통 이렇게 많이들 쓰세요.

chogahui05   4년 전

보통 free에서 런타임이 뜨는 경우는

할당을 하지 않은 메모리를 해제하려고 한 경우에 발생합니다. 정말로 free만 지우니까 통과되는 걸로 보아서는 잘 모르겠지만..


잘못 동작할 만한 여지가 있는 코드가 몇 개 보이네요. 일단 N, x라던지 x, N이 들어오면..

arr = (int**)malloc(sizeof(int*)*n+1); 이걸 이렇게 처리한 것도 그렇고요.

arr = (int**)malloc(sizeof(int*)*(n+1)); 이 의도 아닌가요?

아. 그리고 사실 한 가지 실수가 더 있는데.. 이건 free 때문에 발생한 건 아니고..

this라고 표시한 부분 잘 보세요. 정말 n개의 열로 충분한가요? 아닌 거 같습니다. this2!!와 this3!!을 보시면 전혀 아니라는 것을 알 수 있어요.

tkdlxmcnrwp   4년 전

감사합니다 ㅠㅠ

배열의 크기를 할당하는과정에서 틀린부분이 많았었네요

arr = (int**)malloc(sizeof(int*)*(n+1)); 가 의도가 맞았고 틀린부분없나 보면서 이부분은 고쳤었는데

arr[x] = arr[x - 1] + n; 이 부분과  arr[0] = (int*)malloc(sizeof(int)*n*(n+1)); 이부분은

arr[x] = arr[x - 1] + (n+1); ,  arr[0] = (int*)malloc(sizeof(int)*(n+1)*(n+1)); 이렇게 고쳤습니다.

앞으로 배열 쓸때에 좀 신경써서 할당해야할거같네요 감사합니다.

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