13.4 C语言中qsort()对一个结构数组排序问题

问题:

我想用qsort() 对一个结构数组排序。

我的比较函数接受结构指针,但是编译器认为这个函数对于qsort() 是错误类型。

我要怎样转换这个函数指针才能避免这样的警告?

这个转换必须在比较函数中进行, 而函数必须定义为接受“一般指针” (const void*) 的类型, 就象上文问题13.6 中所讨论的。

比较函数可能像这样:

int mystructcmp(const void *p1, const void *p2)

{

const struct mystruct *sp1 = p1;

const struct mystruct *sp2 = p2;

/* 现在比较sp1->whatever 和sp2-> ... */

从一般指针到结构mystruct 指针的转换过程发生在sp1 = p1 和sp2 = p2 的初始化中; 由于p1 和p2 都是void 指针, 编译器隐式的进行了类型转换。

另一方面, 如果你对结构的指针进行排序, 则如问题13.6 所示, 你需要间接使用:sp1 = *(struct mystruct * const *)p1。

一般而言, 为了让编译器“闭嘴” 而进行类型转换是一个坏主意。

编译器的警告信息通常希望告诉你某些事情, 忽略或轻易去掉会让你陷入危险, 除非你明确知道你在做什么。

参见问题4.5。

永不止步步 发表于01-17 14:55 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308317个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号