2012-09-11 2 views
0

나는 종류의 모든 일 병합을 코딩했지만, 나는 그것이 작동하지 않는 이유를 알아낼 수 없습니다 :( 을 내가 무엇 이건 SIGSEGV라는이 여기 병합 정렬 SEGV, 배열 포인터가 사라지고 있습니까?

는 스택 추적입니다!

#0 0x00401435 in tabLen (tab=0x1) at CodeBlocks\mergeSort.c:7 
#1 0x004014d8 in mergeTabs (tab1=0x1, tab2=0x1) at CodeBlocks\mergeSort.c:26 
#2 0x004016b3 in mergeSort (tab=0x3f1000, size=2) at CodeBlocks\mergeSort.c:51 
#3 0x0040168b in mergeSort (tab=0x3f0fd8, size=3) at CodeBlocks\mergeSort.c:51 
#4 0x0040168b in mergeSort (tab=0x3f2fb0, size=5) at CodeBlocks\mergeSort.c:51 
#5 0x004013ea in main() at CodeBlocks\main.c:9 
# 1과 # 2 사이

, 그것은 배열이 사라진 것처럼, 난 ... 왜

을 이해하지 않습니다 그리고 여기에 내가 시도 구현 :

int tabLen(int *tab) 
{ 
    int i = 0; 

    for (; tab && tab[i] && tab[i] != ENDTAB; ++i) 
     ; 
    return i; 
} 

int *copy(int *tab, int beg, int end) 
{ 
    int size = end - beg + 1; 
    int *res = malloc(size * sizeof(int)); 
    int i = beg; 

    for (; i < end; ++i) 
     res[i - beg] = tab[i]; 
    res[i - beg] = ENDTAB; 
    return res; 
} 

int *mergeTabs(int *tab1, int *tab2) 
{ 
    int len1 = tabLen(tab1); 
    int len2 = tabLen(tab2); 
    int *res = malloc((len1 > len2) ? (len1+1) * sizeof(int) : (len2+1) * sizeof(int)); 
    int i = 0; 
    int t1 = 0; 
    int t2 = 0; 

    printf("len1:%d | len2:%d\n", tabLen(tab1), tabLen(tab2)); 
    for (; t1 < len1 && t2 < len2; ++i) 
     res[i] = (tab1[t1] < tab2[t2]) ? tab1[t1++] : tab2[t2++]; 
    while (t1 < len1) 
     res[i++] = tab1[t1++]; 
    while (t2 < len2) 
     res[i++] = tab2[t2++]; 
    res[i] = ENDTAB; 
    return res; 
} 

int *mergeSort(int *tab, int size) 
{ 
    int *t1 = copy(tab, 0, size/2); 
    int *t2 = copy(tab, size/2, size); 

    if (tabLen(tab) <= 1) 
     return; 
    return mergeTabs(mergeSort(t1, tabLen(t1)), mergeSort(t2, tabLen(t2))); 
} 

아이디어가 있으십니까?

감사합니다, 플로리안 코드를 통해 빠른 검사에서

답변

0

내가 tabLen() 함수에서, 우리는 잘못된 얻을 것으로 나타났습니다 (I 나는 ENDTAB -1 것에 대해 가정을 만들어 로컬 여기 실행) pointer in. 출력은 다음과 같습니다.

% ./a.out 
0x7fffb7dec6e0 
0x7b9030 
0x7b9030 
0x7b9070 
0x7b9070 
0x7b9050 
0x7b9050 
0x1 
Segmentation fault 

내가하고있는 일은 printf ("% p \ n", 탭)입니다. tabLen() 함수에서. 코드에는 다른 문제가있을 수 있습니다. ENDTAB에 대한 나의 가정이 부정확하면 저를 고치십시오.

tabLen (tab) < = 1 인 경우 mergeSort()에서 적절한 값을 반환하고 사용해야합니다.

편집 그냥 스택 추적에서 유효하지 않은 포인터를 나타났습니다. 내 잘못이야.

NULL을 반환하면 코드가 충돌하지 않지만 확실히 문제가 있습니다. 이는 tabLen()에서 NULL이 아닌 탭이 충돌하지 않는지 검사하기 때문입니다.

+0

안녕하세요, 예 ENDTAB은 -1과 같습니다. – Florian