【发布时间】:2011-02-03 14:32:01
【问题描述】:
我有一个指向 Objective-C 对象的指针数组。这些对象有一个与之关联的排序键。我正在尝试使用 qsort 对指向这些对象的指针数组进行排序。但是,第一次调用比较器时,第一个参数指向数组中的第一个元素,但第二个参数指向垃圾,当我尝试访问其排序键时,给了我一个 EXC_BAD_ACCESS。
这是我的代码(意译):
- (void)foo:(int)numThingies {
Thingie **array;
array = malloc(sizeof(deck[0])*numThingies);
for(int i = 0; i < numThingies; i++) {
array[i] = [[Thingie alloc] initWithSortKey:(float)random()/RAND_MAX];
}
qsort(array[0], numThingies, sizeof(array[0]), thingieCmp);
}
int thingieCmp(const void *a, const void *b) {
const Thingie *ia = (const Thingie *)a;
const Thingie *ib = (const Thingie *)b;
if (ia.sortKey > ib.sortKey) return 1; //ib point to garbage, so ib.sortKey produces the EXC_BAD_ACCESS
else return -1;
}
任何想法为什么会发生这种情况?
【问题讨论】:
-
您是否检查过
b是否指向分配的数组内部?也许这会提供一个线索。 -
为什么不使用 NSArray 或类似的可可数据结构来跟踪您的 Thingies 并对其进行排序?
-
遗憾的是,NSArray 在这个特殊 案例中不符合我的要求。请参阅下面我对 bbum (优秀)答案的回复。
标签: objective-c qsort