2017-11-21 16 views
-1

배열을 가져 와서 heapify하고 k 번째로 작은 원소를 찾는 프로그램을 코딩하고 있습니다. 내 교과서에서 필요한 많은 알고리즘을 얻을 수 있었지만 프로그램을 테스트하려고 할 때마다 세그먼트 오류가 발생하기 때문에 지금 당황했습니다. 구조체의 교과서에는 q의 크기로 PQ_SIZE가 있지만 그 작업을하는 이유 또는 방법을 알아 내지 못했습니다. 따라서 6을 테스트했는데 n은 5 였기 때문에 6을 만들었습니다. 프로그램을 누른 다음 5를 내 첫 번째 숫자로 입력하면 6보다 작아도 세그먼트 분할 오류가 발생합니다. 일반적으로 혼란스럽고 모든 조언이 내 코드와 관련하여 매우 감사 할 것입니다. 감사합니다. 이 멤버에 값을 할당하는 경우heapify/find min 프로그램에서 세그멘테이션 오류가 발생하는 이유는 무엇입니까?

+0

디버깅하십시오. 디버거를 사용하는 법을 모른다면,'printf() s'를 추가하면 어떤 일이 잘못되기 시작하는지 알 수 있습니다. – John3136

+0

당신의 색인은 하나씩 떨어져 있습니다. 하나의 기반 색인을 사용하여 힙을 표현하는 것이 일반적입니다. 실제 구현은 C 배열이 작동하는 방식이기 때문에 0 기반을 사용해야합니다. –

+0

질문에서 코드를 삭제하는 이유는 무엇입니까? 그래서 생각의 일부는 우리 모두가 다른 사람들의 실수로부터 배우는 것입니다. 이제 누군가이 질문에 오면 코드를 볼 수 없으며 제공된 대답은별로 의미가 없습니다. –

답변

1

main() 당신이 정의되지 않은 행동을 이끌 것입니다

priority_queue* heap; 
pq_init(heap); 

, 당신은 이전

그것을 사용하는 heap에 메모리를 할당해야 pq_init()에 초기화되지 않은 포인터 *heap을 통과
+0

다른 문제가 있지만 이것은 segfault를 유발할 가능성이 큽니다. –

+0

대단히 고맙습니다. 실제로 저를 위해 일을 끝내 셨습니다. – paul5345

1

게시 된 코드를 실제로 컴파일 했습니까?

컴파일러가 출력하는 경고 메시지 중 하나는 priority_queue *heap;이 초기화되지 않은 상태로 사용된다는 것입니다.

특히 포인터는 함수 pq_init()으로 전달됩니다.

함수 : pq_init()은 필드에 대한 포인터 n을 참조 해제합니다.

그러나 포인터 : heap은 응용 프로그램이 소유 한 메모리의 일부 영역에 할당되지 않았습니다 (malloc()에 대한 호출로 수정 됨). 있는 그대로, 포인터 heap에는 포인터가있는 스택에서 휴지통이있는 위치가 포함됩니다.

참고 : 구조체 priority_queue의 정의에는 tag 이름이 없습니다. 이러한 태그 이름의 부족은 디버거를 사용하여 프로그램을 단계별로 실행할 때 문제가됩니다.

====

변수 (및 매개 변수) 이름은 content 또는 usage (또는 더 나은, 둘 다)를 표시해야합니다. i 같은 이름, j, q, px

====, 심지어 현재의 맥락에서 의미가

공리 따라야 코드 : 기껏 (한 줄에 하나 개의 문장과) 명령문 당 하나의 변수 선언.

====

가독성과 이해의 용이성 :

  1. 별도의 코드 블록 (대한, 다른, 만약 동안, ... 할 동안, 스위치의 경우, 기본) 하나의 빈 줄을 통해.
  2. 2 또는 3 개의 공백 행으로 구분 된 기능
+0

사과, 나는 아직 꽤 초보자입니다. 자세한 답변을 주셔서 대단히 감사합니다. – paul5345