Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 二进制搜索访问超出范围的索引_C_Arrays_Algorithm_Search - Fatal编程技术网

C 二进制搜索访问超出范围的索引

C 二进制搜索访问超出范围的索引,c,arrays,algorithm,search,C,Arrays,Algorithm,Search,代码如下: char binarySearch(unsigned int target, int* primes, unsigned int size){ int* ptrToArray = primes; unsigned int first = 0; unsigned int last = size; while (first <= last){ unsigned int middle = first + (last - first)

代码如下:

char binarySearch(unsigned int target, int* primes, unsigned int size){
    int* ptrToArray = primes;
    unsigned int first = 0;
    unsigned int last = size;

    while (first <= last){
        unsigned int middle = first + (last - first) / 2;
        printf("first: %d, last: %d, middle: %d\n", first, last , middle);

        if (ptrToArray[middle] == target){
            return 1;
        }

        if (ptrToArray[middle] < target){
            first = middle + 1;
        }else{
            last = middle - 1;
        }
    }
    return 0;
}
charbinarysearch(无符号整数目标、整数*素数、无符号整数大小){
int*ptrToArray=素数;
无符号int first=0;
unsigned int last=大小;

而(第一个如果
中间的
0
,在调试输出接近尾声时,语句

last = middle - 1

导致整数溢出;必须对条件进行一些修改。

当您查找不在数组中的元素时,可能会得到一个超出范围的值,该值大于数组,这是因为允许在
最后一个
第一个
中彼此相等时保持迭代(首先问题是您定义了索引变量(
first
last
middle
)在逻辑中,
last
实际上可以变成负数。但是,在这种情况下,由于它们被定义为
unsigned
,并且由于2的负数补码表示方式的工作方式,
while
循环中的条件仍然为真

请查看以下示例代码以进行说明:

#包括
int main(){
/*将变量定义为无符号*/
无符号int first_=0;
无符号int last_=-1;

if(first_首先,中间的负值是由于溢出(unsigned int)

另外,我认为您应该有:unsigned int last=size-1,因为如果first变为等于last=size,您将使用ptrToArray[middle]和middle=size,因此它将超出数组边界。这也将解决上述size=0的情况

最后,为了使代码更易于阅读,您可以编写:
middle=(first+last)/2
这是[first,last]空间的中间,并且
等于first+(last-first)/2

@Thomas是的,这是正确的。如果
size
不是有效值,您必须处理这种情况。另外,简单的数学简化
first+(last-first)/2
因此更清楚的是,它位于中间。也就是说,如果
size尝试unsigned int last=size-1;而不是unsigned int last=size;类似于:
last=(中间>0)?middle-1:0;
,很可能是?
last=middle;
,正是这样。你总是会得到一个新的
middle
@Ziezi,因为没有负数,所以使用
无符号int
是安全的,不会引起别人说的话,除了,
middle-1
,所以这是正确的答案。注意
middle=(first+last)/2
始终是可能的,您只是以一种带有
-
符号的方式编写了它,对于没有经验的人来说,它可能看起来很危险。