比较整数函数SIGSEGV

时间:2014-12-27 00:27:09

标签: 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);

一切正常,我得到一个排序列表。但是,如果我尝试自己使用它:

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时返回一个未排序的列表! 这里发生了什么?

2 个答案:

答案 0 :(得分:2)

试试这个:

int a=2;
int b = 2;
compareInts(&a, &b);

您的compare函数接受指针,而不是直接接受整数。 在

中传递两个整数时会发生什么
compareInts(2,3);

你是告诉这个函数分别在内存地址0x00000002和0x00000003找到你的整数,这些都不是有效的地址。

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

答案 1 :(得分:1)

使用此代码:

compareInts(2, 2);

您正在尝试将内存位置2与内存位置2进行比较。这会因为您无法访问内存位置2而导致段违规。您不是要尝试比较两个值< / em>位于您可以访问的内存地址 - 在操作系统意识到您无权访问这些位置之前,您甚至无法达到这一点(并且为您提供了一个很大的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