首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础知识 | 每日一练(122)

基础知识 | 每日一练(122)

作者头像
小林C语言
发布2019-09-23 13:06:47
2780
发布2019-09-23 13:06:47
举报
基础知识练习

读者:我想用 qsort() 对一个结构数组排序。我的比较函数接受结构指针,

但是编译器认为这个函数对于 qsort() 是错误类型。我要怎样转换这个函数指针才能避免这样的警告?

这个转换必须在比较函数中进行, 而函数必须定义为接受 “一般指针” (const void*) 的类型,。

比较函数可能像这样:

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 指针, 编译器隐式的进行了类型转换。

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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档