您的位置:首页 > 其它

二分查找中的堆栈溢出错误

2010-03-02 15:34 190 查看
今天在调试一个二分查找的程序时出现了STACK OVERFLOW错误,原因是对一个未进行排序的数组进行二分查找,由于二分查找的过程是基于分治算法的,所以涉及到堆栈的频繁调用,所以这是今天发生错误的主要原因。但是还有一个,就是退出条件的判断有问题,这个问题使得如果找不到目标的话就无限递归,并最终导致堆栈溢出,溢出时step值是35575,也就是调用35575次后导致堆栈溢出,由此可见给分配的堆栈空间貌似不是很大哦~~这个判断错误大家自己看吧,虽然错误比较低级........而且qsort用的也有问题,后来修改后比较函数里int y=(int)(*b);后来改正了。一句又报出非法的间接寻址错误...qsort第一次用,还是不熟练啊!最终还是搞定了,哈哈,高兴啊!!

程序贴出来,千疮百孔,漏洞百出@#@

--2010-1-21--

Code:

#include<stdio.h>

#include<math.h>

#include<stdlib.h>

#define M 10000

#define FLAG 1

int search(int *src,int dst,int beg,int end);

int intcmp(const void *a,const void *b){

int *x,*y;

x=a;

y=b;

if(*x>*y)

{

return 1;

}

else if(*x==*y)

{

return 0;

}

else

return -1;

}

static int step=0;

extern void divcon(){

int src[M];

void *tran;

register int lop;

for(lop=0;lop<M;lop++)

{

src[lop]=rand()%10000;

}

tran=(void*)src;

qsort(tran,M,sizeof(int),intcmp);

printf("%d s %d",step,search(src,src[1800],0,M-1));

}

int search(int *src,int dst,int beg,int end)

{

int tem=(beg+end)/2;

step++;

if(beg>end)

{

return 0;

}

else

{

if(src[tem]==dst)

{

return tem;

}

if(src[tem]>dst)

{

return search(src,dst,beg,tem);

}

else

{

return search(src,dst,tem+1,end);

}

}

}

//--修改后程序...

#include<stdio.h>

#include<math.h>

#include<stdlib.h>

#define M 10000

int search(int *src,int dst,int beg,int end);

static int step=0;

int intcmp(const void *a,const void *b);

void divcon(){

int src[M];

register int lop;

for(lop=0;lop<M;lop++)

{

src[lop]=rand()%10000;

}

qsort((void*)src,M,sizeof(int),intcmp);

printf("%d s %d",step,search(src,src[1800],0,M-1));

}

int search(int *src,int dst,int beg,int end)

{

int tem=(beg+end)/2;

step++;

if(beg>end)

{

return 0;

}

else

{

if(src[tem]==dst)

{

return tem;

}

if(src[tem]>dst)

{

return search(src,dst,beg,tem-1);

}

else

{

return search(src,dst,tem+1,end);

}

}

}

int intcmp(const void *a,const void *b){

int *x,*y;

x=(int*)a;

y=(int*)b;

if(*x>*y)

{

return 1;

}

else if(*x==*y)

{

return 0;

}

else

return -1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: