这是我的比较功能:
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时,它会返回一个未排序的列表!这里发生了什么事?
发布于 2014-12-26 16:30:32
试试这个:
int a=2;
int b = 2;
compareInts(&a, &b);
您的比较函数接受指针,而不是直接接受整数。当您将两个整数传递到
compareInts(2,3);
你告诉这个函数分别在内存地址0x00000002和0x00000003找到你的整数,这些都是无效地址。
在修改后的函数中,可以比较0x00000002和0x00000003两个指针的值,而不试图取消它们的引用,这样它就不会崩溃。
发布于 2014-12-26 16:34:24
使用此代码:
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
https://stackoverflow.com/questions/27663309
复制