2010-03-25 12 views
1

BinaryInsertionSort의 두 번째 인수로 100보다 큰 값을 전달하면 세그먼트 화 오류가 발생합니다.세그먼트 오류가 발생하는 이유는 무엇입니까?

int 
BinarySearch (int a[], int low, int high, int key) 
{ 
    int mid; 

    if (low == high) 
     return low; 

    mid = low + ((high - low)/2); 

    if (key > a[mid]) 
     return BinarySearch (a, mid + 1, high, key); 
    else if (key < a[mid]) 
     return BinarySearch (a, low, mid, key); 

    return mid; 
} 

void 
BinaryInsertionSort (int a[], int n) 
{ 
    int ins, i, j; 
    int tmp; 

    for (i = 1; i < n; i++) { 
     ins = BinarySearch (a, 0, i, a[i]); 
     if (ins < i) { 
      tmp = a[i]; 
      memmove (a + ins + 1, a + ins, sizeof (int) * (i - ins)); 
      a[ins] = tmp; 
     } 
    } 
} 
+0

아마도 관련이 없지만 if (low> = high)라고 말해야합니다. –

+0

디버거에서 실행하고 스택 추적을 보았습니까? –

+0

아마도 n을 늘리면 전달하는 배열의 크기가 증가 할 것입니다. 디버거를 사용하여 segfaults 행 (그리고 그 시점에서 액세스하려고 시도하는 색인)을 찾으려고 했습니까? – Cascabel

답변

4

당신은 []에 배열을 전달하는의 통합 디버거를 값이 hi와 low가 범위 내에 들도록 충분히 커야합니다.

예를 들어, 크기 1의 배열을 전달하면 low = 0입니다. hi = 2, mid = 1은 범위를 벗어납니다 (크기 1의 배열은 역 참조가있을 수 있습니다. , [1]이 범위를 벗어납니다).

+0

예, 배열의 크기 때문입니다. 원래 어레이 크기는 100이었습니다.배열 크기를 늘리면 새 크기보다 큰 숫자를 지정하지 않으면 오류가 사라집니다. 그러나 왜 배열 크기가 값만큼 커야합니까? 100 개의 정수 배열을 원한다면 왜 그 정수를 임의로 크게 할 수 없습니까? – neuromancer

+0

정수는 MAX_INT의 크기까지 임의로 커질 수 있지만 정수가 저장되는 공간은 a + a ~ hi - 1까지의 주소에 있어야합니다. –

1

스택 오버플로가 원인 일 수 있습니까? 재귀 적으로 BinarySearch으로 전화를 걸었습니다. n 값이 클수록 더 많은 스택 공간을 소비하게됩니다. 이 경우 스택 오버플로가 발생합니다.이 경우 오류가 발생하지만 사용자의 환경을 알 수 없습니다.

디버거를 사용하지 않는다고 가정하면이 문제를 빠르게 테스트 할 수 있습니다 먼저 오류를 얻는 정확한 지점을 찾으십시오 (100을 언급했으나 이 99 ...와 오류가 발생하지 않음).

일단 재귀 호출에 의해 소비되는 스택 공간의 양을 BinarySearch으로 늘리십시오. (몇 가지 추가 로컬 변수를 추가하고 최적화되지 않도록 충분히하십시오.) 더 이상 99 번을 성공적으로 수행 할 수 없게됩니다.

+0

크기가 n = 100 인 배열에서 스택 오버플로가 발생하지 않는 것 같습니다. 이것은 2 진 검색에서 재귀 호출 깊이가 7에 불과하며 재귀 함수의 스택 크기는 무시할 수 있습니다. –

+0

@David Gelhar : 나는 그것에 대해 생각했다. 그러나 그가 그의 'main' 함수를 보여주지 않았기 때문에, 나는 이미 호출 스택에 얼마나 깊은 존재인지 모르겠다. –

1

알려주기 어렵습니다. 디버거를 사용하십시오. 세분화 오류가있는 위치와 세분화 오류가 발생할 때 다른 변수의 값을 찾는 데 도움이됩니다.

리눅스에서
  • : GDB합니다 (-g 옵션 ++ 사용 g을 컴파일) 창에
  • :. 비주얼 스튜디오 C++
관련 문제