这是我的比较功能:
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时返回一个未排序的列表! 这里发生了什么?
答案 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