【发布时间】:2020-12-07 05:40:03
【问题描述】:
我的代码
#include <stdio.h>
#include <stdlib.h>
int compare (const void * a, const void * b)
{
return ( *(long*)a - *(long*)b );
}
int main()
{
long arr[50] = {
96998584605411,40693566272356,
8867531321455,71374670306442,
57352857357994,1788166056027,
63349502945247,59799324891707,
26353174130397,39181960858171,
88760729874506,77735622774927,
65389382041144,83564210278376,
34210610714041,25960810689062,
30915481991565,46863920152180,
39693165577270,81307468736394,
20993925693066,14707273086616,
51940778082526,28031438753382,
51923056867661,16931703600607,
31109898828992,89599450093153,
34498804713695,36774523858020,
65593865433917,39538286624853,
63312447540821,18796138114716,
64794317568658,85850552382870,
56557892707211,72388843001640,
46583476931914,38539500078935,
95031088595551,88735420786323,
87050672468742,13877728078926,
25045274978126,64616891994055,
67682298778152,16659227331485,
41265109202214,77090119561917
};
qsort(arr, 50, sizeof(long), compare);
printf("Values are\n");
int i ;
for (i=0; i< 50; i++)
printf("%ld\n", arr[i]);
}
在没有正确排序的情况下打印其输出
值是
39538286624853
39693165577270
81307468736394
20993925693066
46583476931914
87050672468742
30915481991565
63312447540821
64794317568658
95031088595551
13877728078926
38539500078935
71374670306442
16931703600607
36774523858020
96998584605411
65593865433917
34210610714041
51923056867661
14707273086616
25045274978126
83564210278376
18796138114716
88735420786323
31109898828992
1788166056027
72388843001640
46863920152180
34498804713695
51940778082526
56557892707211
25960810689062
89599450093153
57352857357994
67682298778152
28031438753382
8867531321455
85850552382870
65389382041144
63349502945247
40693566272356
39181960858171
16659227331485
41265109202214
64616891994055
26353174130397
77090119561917
59799324891707
88760729874506
77735622774927
我在打印 qsorted 数组时做错了什么?
【问题讨论】:
-
整数溢出。两个 long 之间的差异不适合 int。
-
*(long*)a - *(long*)b你觉得有什么区别? -
NO - 您不得更改代码以使您自己的问题无效。并且您也不允许将函数指针传递给返回
long的函数,该函数需要返回int的函数指针(更多 UB)。 -
使用更正的代码重新提交评论:比较函数中的整数溢出 - 未定义的行为。不要使用减法——当数字足够大且符号相反时,它是懒惰的并且不能正常工作。要么用速记:
int compare(const void *p1, const void *p2) { long v1 = *(long *)p1; long v2 = *(long *)p2; if (v1 < v2) return -1; else if (v1 > v2) return +1; else return 0; },要么用速记:int compare(const void *p1, const void *p2) { long v1 = *(long *)p1; long v2 = *(long *)p2; return (v1 > v2) - (v1 < v2); }— 很抱歉出现故障! -
如果函数返回
long,如果一个值大而负,另一个值大而正,您可能会遇到(长)整数溢出。这是一个问题。另一个问题是qsort()需要一个匹配int (*cmp)(const void *p1, const void *p2)的函数指针,所以如果你的函数返回long,而不是int,那么传递给qsort()的类型是错误的。您显然在 64 位机器上(或使用至少 64 位的long的机器),所以int是 32 位类型,long是 64 位类型 - 错误的类型函数指针将无法可靠地工作。