c-我的合并排序有什么问题



我想用指针写一个合并排序,但当我尝试在C中执行时,遇到了分段错误。我本以为会出现分段错误,但实际上并不是在哪里。这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int *merge(int [], int *, int *, int *); 
int *mergesort(int [], int *, int *); 
int main(){
int n[] = {4, 2, 9, 5, 10, 11, 1, 0}; 
int *m = mergesort(n, n, n + 7); 
int i;
for(i = 0; i < 7; i++)
printf("[%d]n", n[i]); 
return 0;
}
int *mergesort(int *a, int *p, int *r){
if(p >= r)
return a; 
int *q = p + (q - p)/2;
mergesort(a, p, q); 
mergesort(a, q+1, r); 
return merge(a, p, q, r);   
}
/*0, 1, 2, 3, 4, 5, 6, 7*/
int *merge(int *a, int *p, int *q, int *r){
/*int *arrone = new int[q - p + 1]; 
int *arrtwo = new int[r - q]; */
int *arrone = malloc(sizeof(int) * (q - p + 1));
int *arrtwo = malloc(sizeof(int) * (r - q)); 
int i;
for(i = 0; p + i <= q; i++)
arrone[i] = p[i]; 
for(i = 0; q + i + 1 <= r; i++)
arrtwo[i] = *(q + 1 + i); 
int j;
for(j = 0; arrone <= q && arrtwo <= r; j++){
if(*arrone < *arrtwo)
a[j] = *arrone, arrone++; 
else
a[j] = *arrtwo, arrtwo++; 
}
if(arrone <= q)
for(; p + j <= r; j++)
a[j] = *arrone++; 
else
for(; p + j <= r; j++)
a[j] = *arrtwo++;
free(arrone);
free(arrtwo);
return a; 
}

现在奇怪的是,我在第一次调用mergesort时就发现了这个分段错误。在DDD中,它一碰到这个函数就会出错。DDD给我这个

程序接收到信号SIGSEGV,分段故障。(很长address)(读取变量时出错:无法访问地址0x7fffff7feff8处的存储器,p=<读取变量时出错:无法在0x7fffff7feff0访问存储器,r=<读取变量时出错:无法访问地址0x7fffff7fefe8处的内存)开始定义)

然而,当我回溯它时,它在merge中调用第二个mergesor的行上提供了无限多的调用,尽管我不明白为什么这与调用第一个mergesort的行有任何不同(实际上,这个也在我的gdb回溯的第0帧中突出显示)

这次我做错了什么?

这里的q是什么?您正在声明*q,并在表达式中使用q进行初始化。。

int *q = p + (q - p)/2;

此外,

a[j] = *arrtwo++;   <-- Here increment of pointer is happening instead of value

应用作

a[j] = (*arrtwo)++;

并且因此随后在CCD_ 4中失败。检查所有此类实例。

我认为你的指针增量逻辑可以是正确的,但你不能释放更新的指针,它可能同时指向其他东西。

问题就在这里-----int*q=p+(q-p)/2;

在初始化q之前,您要为*q赋值,所以q有垃圾值,上面的语句将为*q分配垃圾值。

你心目中的逻辑是什么?-int*q=p+(q-p)/2;

相关内容

  • 没有找到相关文章

最新更新