c语言怎么让写的函数兼容int型和char型_既然C语言void指针是“万能指针”,那么malloc还需类型转换吗?...

在C语言程序开发中,动态内存分配是不可避免的,而调用 malloc()/free() 库函数实现这一过程是方便的,事实上,在很多C语言程序中,malloc/free 库函数的使用相当频繁,它俩的C语言函数原型如下,请看:

void *malloc(size_t size);void free(void *ptr);
5c0f121c35bafb84d16390ae0a18fa09.png

malloc() 函数需要类型转换吗?

正常情况下,malloc() 函数会从堆中申请 size 字节的内存,并且将这块内存的首地址返回,原则上,系统不会再将被 malloc() 申请的内存分配给其他代码使用,除非 free() 函数将 malloc() 申请的内存释放。

malloc() 函数需要类型转换吗?

读者应该注意到,malloc() 函数的返回值是 void * 指针型的。看过我之前文章的读者应该明白,在C语言中,void * 指针是不能够直接用于索引数据的。

342ef998f6ca5abd9c381c525a075763.png

void * 指针是不能够直接用于索引数据的

因此在实际的C语言程序开发中,程序员调用 malloc() 函数时,一般都会定义其他类型的指针,例如:

char *cp = malloc(size);

读者看到这里,可能会产生疑问:malloc() 函数的返回值类型是 void * 指针型,而变量 cp 则是 char * 指针型,似乎出现了类型不匹配的情况,是否需要类型转换呢?

5bdd9c3ffb97f1288a8e791252e9d1c6.png

是否需要类型转换呢?

事实上,的确不少C语言程序员在调用 malloc() 函数时会使用类型转换:

char *cp = (char *)malloc(size);int *ip = (int *)malloc(size * sizeof(int));...

那么,调用 malloc() 函数时,究竟需要不需要类型转换呢?

不需要?

有程序员认为,C语言经过这么多年的发展,对于 malloc() 函数,如今似乎不再需要类型转换了,因为 void * 指针会自动的并且安全的被转换为对应类型的指针。void * 指针在很多C语言教材中被称为“万能指针”,这里就是一个体现。

9caf6cc0d4a513369b6c02c0a618c6c5.png

void * 指针在很多C语言教材中被称为“万能指针”

既然 void * 指针可以自动的被转换成对应的指针类型,那么再写类型转换代码似乎就“多余”了,反而会让整个C语言代码啰嗦臃肿,损失可读性,尤其是指针类型名很长的时候,例如:

struct this_is_test *p = (struct this_is_test *)malloc(size);// 不写类型转换代码struct this_is_test *p = malloc(size);

上面的C语言代码显然有重复部分,而且这段重复的C语言代码的“类型转换功能”也是多余的,要是以后需要修改结构体 this_is_test 的名字,还需要修改强制类型转换部分的代码,略显繁琐。与之相对的,下面这行C语言代码明显简洁许多。

4d5fa3b370a55461a539a7d3bac29135.png

下面这行C语言代码明显简洁许多

这么看来,似乎对 malloc() 函数做类型转换“百害而无一利”了,有程序员甚至认为,在C语言程序开发中,调用 malloc() 函数使用类型转换,只是因为不知道类型转换会带来的潜在不利而已。

需要?

不过,也有C语言程序员持反对意见,他们认为,在调用 malloc() 时使用类型转换可以让代码在 C语言和C++之间可移植,有些程序员以为自己在写C语言程序,但是他们实际上还是会用到C++的一些特性。

20066fb5ca6164b95223fb0b1fd8f5d3.png

在 C语言和C++之间可移植

另外,调用 malloc() 函数使用类型转换还可以发现一些潜在的风险,例如有的C语言程序员会在开发中弄混 type * 和 type ** ,如果没有显式的类型转换,这样的错误就会被编译器隐藏掉了。

因此,在对 malloc() 函数的返回值做数据类型转换的过程,本身就是C语言程序员自检代码的过程,这样更加容易在开发阶段就发现 bug。而且,如果C语言程序出现了数据类型相关的错误,调用 malloc() 函数做了类型转换肯定能够更加方便的定位错误。

小结

弄清楚在C语言程序开发中调用 malloc() 函数时,做不做类型转换的各自特点后,应该能够发现其实各有各的好处,那究竟是否需要做类型转换,就在于程序员自己的开发习惯了。

bab7bc86f36a756ff29cebc4c7eb716c.png

点个赞再走吧

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql datetime最小值_MySQL的5种时间类型的比较

日期时间类型占用空间日期格式最小值最大值零值表示DATETIME8 bytesYYYY-MM-DD HH:MM:SS1000-01-01 00:00:009999-12-31 23:59:590000-00-00 00:00:00TIMESTAMP4 bytesYYYY-MM-DD HH:MM:SS197001010800012038 年的某个时刻00000000000000DATE4 bytesYYYY-MM-DD1000-01-019999-1…

Mysql数据库的简单备份与还原_史上最简单的MySQL数据备份与还原教程

本文主要为大家详细介绍了史上最简单的MySQL数据备份与还原教程第一篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。数据备份与还原第一篇分享给大家,具体内容如下基础概念:备份,将…

mysql数据库云读取_云数据库 MySQL版

{"moduleinfo":{"banner_bigTit":"云数据库 MySQL版读写分离上线","banner_subTit":"自动扩展读写分离,性能提升不止一点","banner_link":"https://rdsnew.console.aliyun.com/console/index#/rd…

mysql查询并设置高亮_慢查询分析调优工具~mysqldumpslow

在日常的业务开发中,MySQL出现慢查询是很常见的,要么说明你家产品的增长性很好,要么就是你的SQL写的太烂了。所以对慢查询SQL进行分析和优化很重要,其中mysqldumpslow是MySQL服务自带的一款很好的分析调优工具。MySQL慢查询日志My…

非法的表达式开始_轮回、开始还是结束?

上节课说到&#xff0c;要打印0-9这十个数字&#xff0c;除了一个一个的 document.write 还有什么办法?下面介绍一个for语法for (var 变量 初始值; 结束判断表达式; 变量递增/递减) { 循环体&#xff0c;用于处理变量;}我们来实操一下for (var c0;c<9;cc1) { do…

sql 统计记录条数后 打印出所有记录_用SQL完成购买行为分析(下篇II)

&#xff08;接《用SQL完成购买行为分析&#xff08;下篇I&#xff09;》内容&#xff09;12&#xff09;查询首条记录为fav&#xff0c;总记录条数为14的记录。将前面getNum(3)红框处替换为12&#xff0c;运行getNum(14)得到第2条记录的数量&#xff1a;替换为11&#xff0c;得…

library的英语怎么读音_library怎么读声音

library的英式读音和美式读音均为&#xff1a;[ˈlaɪbrəri]。library可作名词&#xff0c;其作名词时&#xff0c;中文意思有&#xff1a;图书馆&#xff1b;藏书楼&#xff1b;图书室&#xff1b;资料室&#xff1b;(书、激光唱片等的)个人收藏等含义。一、library 读音英式…

sift线特征提取代码_车道线检测LaneNet

LanNetSegmentation branch完成语义分割,即判断出像素属于车道or背景Embedding branch完成像素的向量表示,用于后续聚类,以完成实例分割H-NetSegmentation branch解决样本分布不均衡车道线像素远小于背景像素.loss函数的设计对不同像素赋给不同权重,降低背景权重.该分支的输出为…

mysql ehcache_MyBatis使用Ehcache作为二级缓存

特别说明&#xff1a;由于二级缓存是基于Mapper的&#xff0c;当你在不同的mapper中查询了相同的数据&#xff0c;例如不同的Mapper中有多表查询时结果中有相同的数据&#xff0c;当其中一个Mapper进行插入更新缓存时&#xff0c;另一个并没有插入更新&#xff0c;那么使用两个…

yii3正式版什么时候发布_华为mate50pro什么时候发布

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。 …

shiro如何保证session不失效_请问在不加锁的情况下如何保证线程安全?

概念compare and swap&#xff0c;解决多线程并行情况下使用锁造成性能损耗的一种机制&#xff0c;CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配&#xff0c;那么处理器会自动将该位置值更新为新值。否则&#xff0c;处理器…

externalreferences 命令在 sdi 模式下不可用_一个适合新手交互式Git命令学习项目

前言在我们日常工作开发中&#xff0c;Git是必不可少的版本控制软件&#xff0c;很多时候我们都用Git来管理我们的项目。比较常用的有Github&#xff0c;Gitlab&#xff0c;Stash等。因此对于Git命令的掌握是我们工作必备的能力。今天分享一个Git命令学习项目&#xff1a;learn…

sqlyong 删除数据能否撤回_数据结构知识点总结

some quoted by Fundebug&#xff1a;代码面试需要知道的8种数据结构(附面试题及答案链接)​zhuanlan.zhihu.comadded with other sources8 种常用数据结构数组栈队列链表图树哈希表priorityqueue1. 数组数组(Array)大概是最简单&#xff0c;也是最常用的数据结构了。其他数据结…

matlab 点云特征_基于点云的3D障碍物检测

击上方“新机器视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达基于点云的3D障碍物检测主要有以下步骤&#xff1a;点云数据的处理基于点云的障碍物分割障碍物边框构建点云到图像平面的投影点云数据的处理KITTI数据集KITTI数据集有四个相…

重定义 不同的基类型_镍及铁镍基耐蚀合金高温合金哈氏合金镍基合金之第一篇概述...

纯镍是一种重要的应用于工业的原材料&#xff0c;它除具有良好 的强度、塑韧性外&#xff0c;在卤族元素及其氢化物活泼性气体、苛 性介质、不含氧和氧化剂的还原性酸介质中还具有良好的耐 蚀性&#xff0c;因此纯镍作为耐蚀金属材料得到广泛应用。此外&#xff0c;由 于提高耐…

cad统计面积长度插件vlx_用了它,画cad施工图再也不加班了!

文尾左下角阅读原文看视频教程好课推荐&#xff1a;1、CAD2014&#xff1a;点击查看 2、室内CAD&#xff1a;点击查看 3、CAD2019&#xff1a;点击查看4、CAD2018&#xff1a;点击查看5、Bim教程&#xff1a;点击查看6、室内手绘&#xff1a;点击查看7、CAD三维&#xff1a;点击…

mysql 视图 查询速度慢_mysql 视图查询速度慢

场景&#xff1a;表 stockpooldata_flashCREATE TABLE stockpooldata_flash (id bigint(15) NOT NULL AUTO_INCREMENT,formula_id int(8) DEFAULT NULL,period_type tinyint(3) DEFAULT NULL,gpMarket int(4) DEFAULT NULL,gpcode varchar(20) DEFAULT NULL,ymd int(11) DEFAUL…

局部页面切换url为什么不变_python爬虫 - 翻页url不变网页的爬虫探究

python爬虫-翻页url不变网页的爬虫探究url随着翻页改变的爬虫已经有非常多教程啦&#xff0c;这里主要记录一下我对翻页url不变网页的探究过程。学术菜鸡第一次写CSDN&#xff0c;请大家多多包容&#xff5e; 如果对你有一点点帮助&#xff0c;请帮我点个赞吧&#xff01;翻页u…

python波峰波谷算法_波动均分算法

波动均分算法by leeenx on 2018-01-11「波动」和「均分」大部分读者朋友是知道的&#xff0c;但看到「波动均分」应该是一头雾水的。其实&#xff0c;这个名词是笔者拼凑出来的。什么是「波动均分」&#xff1f;把指定的数值 A&#xff0c;分成 N 份&#xff0c;此时每份的数值…

java web 注册登录_javaweb实现登录注册功能实例

前期呢&#xff0c;我们学习了javaweb项目用JDBC连接数据库&#xff0c;还有数据库的建表功能&#xff0c;今天&#xff0c;我们来看一下javaweb实现登录注册功能实例&#xff0c;javaweb项目使用的工具是eclipse&#xff0c;最后把项目部署在了Tomcat中&#xff0c;连接数据库…