我想qsort
一个整数数组的前100个元素,其余的元素保持不变。
我目前正在尝试通过以下调用来实现这一点:
int cmpfunc(const void *a, const void *b)
{
int xi = *(const int *) a;
int yi = *(const int *) b;
return (xi - yi);
}
int my_array[100+some_size];
memset(my_array, 0, sizeof(my_array));
qsort(my_array, 100, sizeof(int), cmpfunc);
然而,我得到了一个分段错误。在C中对数组的第一个x
值进行排序可能吗?
2条答案
按热度按时间63lcw9qa1#
从
qsort
函数的Angular 来看,在前100个元素之后是否有更多的数组元素没有区别,因为它只获得指向数组开始的指针,以及开始指针之后的元素数量。所以,是的,假设可以对一个有100个元素的数组进行排序,也可以对一个更大的数组的前100个元素进行排序。
c0vxltue2#
您可以对数组的任何部分进行排序,该数组正确地提供指向元素排序范围的初始元素的指针以及该范围中的元素数。
至于你的问题,那么它的原因可能是整数溢出,导致未定义的行为产生的比较函数
在return语句中。
下面是一个简单的例子。假设
xi
等于INT_MAX
,yi
等于-1
。那么表达式xi - yi
会导致整数溢出,例如它的值可能是负值,而实际上函数应该返回一个正数,因为xi
大于yi
。也就是说,在任何情况下,比较函数都是错误的。
您应该按以下方式重写比较函数
这是一个演示程序。
程序输出为
如果你尝试在演示程序中使用你的比较函数,那么至少你会得到一个不正确的结果。
例如,使用内联编译器,我得到以下输出
正如你所看到的,数组的第一部分排序不正确。