基于32位无符号整数比较的qsort排序失败问题求助
问题排查:qsort排序结构体数组失败的原因
嘿,这个问题我太熟悉了——你在调用qsort时的元素个数计算完全错误,这是C语言里指针和数组混淆的典型坑!
核心错误分析
你写的qsort调用是这样的:
qsort(array, (size_t)(sizeof(array)/sizeof(struct edge)), sizeof(struct edge), struct_cmp_by_v1);
这里的第二个参数是用来告诉qsort数组里有多少个元素,但你用了sizeof(array)——注意,array是struct edge*类型的指针,不是静态数组!
在C语言里:
- 当
sizeof作用于静态数组名时,返回的是整个数组的总字节数 - 但当
sizeof作用于指针时,返回的是指针本身的大小(32位系统是4字节,64位是8字节)
所以你计算出来的元素个数其实是指针大小 / 结构体大小,这显然和你实际分配的Narray个元素完全不符。qsort要么只排序了前几个元素,要么因为传入的元素个数太小,大部分元素根本没被处理,最终导致排序看起来“失败”。
修复方法
你已经用Narray来分配内存了,直接把qsort的第二个参数改成Narray就行:
qsort(array, Narray, sizeof(struct edge), struct_cmp_by_v1);
额外确认:你的比较函数是正确的
顺便说一句,你的struct_cmp_by_v1函数写得没问题:它正确地将void*转换为struct edge*,并且按照无符号整数的大小关系返回了合法的-1/0/1,这部分不需要修改。
内容的提问来源于stack exchange,提问作者Ivan Pereyra
相关产品推荐
相关产品推荐

