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