C - qsort 将错误的指针发送到比较器函数?
C - qsort sends the wrong pointers to the comparator function?
我的问题是 qsort 似乎正在向比较器函数发送奇怪的指针。如果我创建 2 个间隙并将它们的指针作为参数发送,比较器函数本身似乎工作正常。但是,在调试时我得到了错误的值,即使间隙数组已正确初始化。
我是 运行 Windows 10 上的代码,如果这很重要的话。
间隙定义和比较函数:
typedef struct open_space_t{
ssize_t size;
off_t start;
}Gap;
int GapComparator(const void * aa, const void * bb){
ssize_t a = ((Gap*) aa)->size;
ssize_t b = ((Gap*) bb)->size;
if(a>b){
return 1;
}
if(b>a){
return -1;
}
else{
return 0;
}
}
运行 排序:
Gap** allGaps = malloc((2) * sizeof(*allGaps));
allGaps[0] = malloc(sizeof(*allGaps[0]));
allGaps[0]->size = 20;
allGaps[0]->start = 30044;
allGaps[1] = malloc(sizeof(*allGaps[0]));
allGaps[1]->size = 20;
allGaps[1]->start = 30064;
qsort(allGaps, 2, sizeof(*allGaps), GapComparator);
比较器接收指向它应该比较的元素的指针。您的数组元素是指针 (Gap *
)。因此比较器接收 Gap **
.
修复:
int GapComparator(const void * aa, const void * bb){
ssize_t a = (*(Gap**) aa)->size;
ssize_t b = (*(Gap**) bb)->size;
或者:
int GapComparator(const void *aa, const void *bb) {
const Gap **pa = aa, **pb = bb;
ssize_t a = (*pa)->size;
ssize_t b = (*pb)->size;
我的问题是 qsort 似乎正在向比较器函数发送奇怪的指针。如果我创建 2 个间隙并将它们的指针作为参数发送,比较器函数本身似乎工作正常。但是,在调试时我得到了错误的值,即使间隙数组已正确初始化。
我是 运行 Windows 10 上的代码,如果这很重要的话。
间隙定义和比较函数:
typedef struct open_space_t{
ssize_t size;
off_t start;
}Gap;
int GapComparator(const void * aa, const void * bb){
ssize_t a = ((Gap*) aa)->size;
ssize_t b = ((Gap*) bb)->size;
if(a>b){
return 1;
}
if(b>a){
return -1;
}
else{
return 0;
}
}
运行 排序:
Gap** allGaps = malloc((2) * sizeof(*allGaps));
allGaps[0] = malloc(sizeof(*allGaps[0]));
allGaps[0]->size = 20;
allGaps[0]->start = 30044;
allGaps[1] = malloc(sizeof(*allGaps[0]));
allGaps[1]->size = 20;
allGaps[1]->start = 30064;
qsort(allGaps, 2, sizeof(*allGaps), GapComparator);
比较器接收指向它应该比较的元素的指针。您的数组元素是指针 (Gap *
)。因此比较器接收 Gap **
.
修复:
int GapComparator(const void * aa, const void * bb){
ssize_t a = (*(Gap**) aa)->size;
ssize_t b = (*(Gap**) bb)->size;
或者:
int GapComparator(const void *aa, const void *bb) {
const Gap **pa = aa, **pb = bb;
ssize_t a = (*pa)->size;
ssize_t b = (*pb)->size;