二分查找中的堆栈溢出错误
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;
}
程序贴出来,千疮百孔,漏洞百出@#@
--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;
}
相关文章推荐
- LeetCode 374 使用循环代替递归的二分查找从而避免栈溢出的错误
- 金山词霸2003导致我的程序堆栈溢出错误
- iOS错误堆栈查找崩溃原因的方法
- 二分查找错误事例分析
- backtrace&&backtrace_symbols 查找段错误 打印堆栈信息
- 错误 'ASP 0107 : 80004005' 堆栈溢出IIS解决方法
- STL 二分查找抛出错误(map/set iterator not dereferencable)
- 算法题:二分查找的溢出考虑
- leetcode_69题——Sqrt(x)(二分查找,还有个溢出问题的研究)
- 二分查找(一) 常见错误
- 第十题 二分查找 还是有好多错误
- 71.iOS 错误堆栈查找崩溃原因的方法---根据崩溃信息,找到对应的崩溃代码
- Leetcode#4.Median of Two Sorted Arrays(归并排序&二分查找求第k小的数)
- 选择排序、冒泡排序、二分查找
- 二分查找--AVL查找树
- hdoj 3763 CD(二分查找)
- 【玩转cocos2d-x之三十八】如何使用NDK-STACK tool来恢复Cocos2d-x安卓错误堆栈信息
- 二分查找算法
- 二分查找时间复杂度推导
- 第三周作业——顺序查找和二分查找