C语言 地址消毒剂:死亡信号

zbdgwd5y  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(143)

我无法找出这个错误的原因。

  1. int binarySearch(int* arr,int l,int r,int x){
  2. int mid = (l+r)/2;
  3. if(arr[mid]==x){
  4. return mid;
  5. }
  6. else if(arr[mid]>x){
  7. binarySearch(arr,mid,r,x);
  8. }
  9. else if(arr[mid]<x){
  10. binarySearch(arr,l,mid,x);
  11. }
  12. else{
  13. return -1;
  14. }
  15. return 0;
  16. }
  17. int search(int* nums, int numsSize, int target){
  18. return binarySearch(nums,0,numsSize-1,target);
  19. }

这是一个简单的二分查找程序.这是错误.

  1. ==30==ERROR: AddressSanitizer: stack-overflow on address 0x7ffdbdd5cff8 (pc 0x55745fa9be6c bp 0x7ffdbdd5d010 sp 0x7ffdbdd5d000 T0)
  2. ==30==ABORTING
bpsygsoo

bpsygsoo1#

对于初学者来说,似乎是由于输入错误,第一个函数参数的类型不正确。

  1. int binarySearch( const int arr[], int l, int r, int x );

如果目标元素不等于数组中的元素,则函数不会停止递归调用自身。
另外,如果arr[mid]大于x,那么[mid, r]范围内的所有值显然也将大于x

  1. else if(arr[mid]>x){
  2. binarySearch(arr,mid,r,x);
  3. }

不正确,
使用您的方法,函数定义可以如下所示

  1. int binarySearch( const int arr[], int l, int r, int x )
  2. {
  3. if ( !( r < l ) )
  4. {
  5. int mid = l + ( r - l ) / 2;
  6. if( arr[mid] == x )
  7. {
  8. return mid;
  9. }
  10. else if ( x < arr[mid] )
  11. {
  12. return binarySearch( arr, l, mid - 1, x );
  13. }
  14. else
  15. {
  16. return binarySearch( arr, mid + 1, r, x );
  17. }
  18. }
  19. return -1;
  20. }

注意,搜索到的数组必须排序。

展开查看全部

相关问题