2012-09-11 72 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

从通过代码快速扫描(我这里跑在本地,我做了有关端部拉头是-1的假设),我注意到,在tabLen()函数中,我们得到了一个无效指针输入。输出如下所示。

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

我在做什么是printf(“%p \ n”,tab);在tabLen()函数中。你的代码也可能有其他问题。如果我对ENDTAB的假设不正确,请纠正我。

请确保您在案件tabLen(标签)< = 1中的mergeSort()中返回适当的值并使用它。

编辑

只注意到在堆栈跟踪无效的指针。我的错。

返回NULL,不会使代码崩溃,但它肯定有问题。这只是因为你在tabLen()中检查tab是否为非NULL,所以它不会崩溃。

+0

嗨,是ENDTAB等于-1! – Florian