C 比较整数函数SIGSEGV

C 比较整数函数SIGSEGV,c,function,integer,compare,qsort,C,Function,Integer,Compare,Qsort,这是我的比较函数: int compareInts(const void *a, const void *b) { const int *pa = (const int*)a; const int *pb = (const int*)b; return *pa - *pb; } 当我将此函数与整数数组一起传递给qsort时: qsort(a, size, sizeof(char*), compareInts); 一切都很好,我得到了一个排序列表。但是,如果我自己尝试使

这是我的比较函数:

int compareInts(const void *a, const void *b) {
    const int *pa = (const int*)a;
    const int *pb = (const int*)b;
    return *pa - *pb;
}
当我将此函数与整数数组一起传递给qsort时:

qsort(a, size, sizeof(char*), compareInts);
一切都很好,我得到了一个排序列表。但是,如果我自己尝试使用它:

compareInts(2, 2);
我得到一个SIGSEGV,除非我修改函数如下:

int compareInts(const void *a, const void *b) {
    const int *pa = (const int*)a;
    const int *pb = (const int*)b;
    return pa - pb;
}
当我调用它时,它工作得很好,但当传递给qsort时,返回一个未排序的列表! 这是怎么回事?

试试这个:

int a=2;
int b = 2;
compareInts(&a, &b);
比较函数直接接受指针,而不是整数。 当你传入两个整数时会发生什么

compareInts(2,3);
您正在告诉此函数分别在内存地址0x00000002和0x00000003处查找整数,而这些地址无效


在修改后的函数中,比较两个指针0x00000002和0x00000003的值,而不尝试取消引用,因此不会崩溃。

使用以下代码:

compareInts(2, 2);
您正在尝试比较内存位置2和内存位置2。这将导致段冲突,因为您无法访问内存位置2。您没有尝试比较位于您可以访问的内存地址的两个值-在操作系统意识到您无法访问这些位置之前,您甚至无法达到这一点(并为您提供了一个大SEGV,谢谢您的尝试)。您需要比较实际可以访问的内存地址的内容。例如:

  int a = 2;   // a is an integer variable, you can take the address of this
  int b = 2;   // ibid

  compareInts(&a, &b);  // now, you are giving your function *the addresses of* a and b

与@DNT重叠——如果您要接受其中一个作为答案,请让我看看他的-慢速打字日。
qsort()
的第三个参数是每个元素的大小。如果实际对
int
数组进行排序,那么第三个参数应该是
sizeof(int)
,或者
sizeof(*a)
“2”不是指针,函数需要两个指针。因此,它认为“2”是指针,并将其视为指针。访问超出进程数据限制的地址2会导致未定义的行为,从而导致seg故障事件。程序的第二个版本是比较指针,而不是指针所指向的对象。“不尝试取消引用”-->应该是“不在调用中传递它们的地址,而不仅仅传递原始值“2”(即存储在该地址中的值)。您的函数需要一个地址。OP的问题之所以出现,是因为他/她试图取消引用它们。在修改后的函数中,您正在比较指针中的值。另一方面,qsort一次正确地将两个值传递给比较器,这意味着它执行类似于比较器的操作(&arr[i]、&arr[j])因此它是有效的。qsort不关心compareInts对值的作用-它只需要一个整数结果。如果将修订后的函数与qsort一起使用,则将比较内存地址而不是值。