既然void指针是“万能指针”,那么调用malloc还需要类型转换吗?
在C语言程序开发中,动态内存分配是不可避免的,而调用 malloc()/free() 库函数实现这一过程是方便的,事实上,在很多C语言程序中,malloc/free 库函数的使用相当频繁,它俩的C语言函数原型如下,请看:
malloc() 函数需要类型转换吗?
正常情况下,malloc() 函数会从堆中申请 size 字节的内存,并且将这块内存的首地址返回,原则上,系统不会再将被 malloc() 申请的内存分配给其他代码使用,除非 free() 函数将 malloc() 申请的内存释放。
malloc() 函数需要类型转换吗?
读者应该注意到,malloc() 函数的返回值是 void * 指针型的。看过我之前文章的读者应该明白,在C语言中,void * 指针是不能够直接用于索引数据的。
void * 指针是不能够直接用于索引数据的
因此在实际的C语言程序开发中,程序员调用 malloc() 函数时,一般都会定义其他类型的指针,例如:
读者看到这里,可能会产生疑问:malloc() 函数的返回值类型是 void * 指针型,而变量 cp 则是 char * 指针型,似乎出现了类型不匹配的情况,是否需要类型转换呢?
是否需要类型转换呢?
事实上,的确不少C语言程序员在调用 malloc() 函数时会使用类型转换:
那么,调用 malloc() 函数时,究竟需要不需要类型转换呢?
不需要?
有程序员认为,C语言经过这么多年的发展,对于 malloc() 函数,如今似乎不再需要类型转换了,因为 void * 指针会自动的并且安全的被转换为对应类型的指针。void * 指针在很多C语言教材中被称为“万能指针”,这里就是一个体现。
void * 指针在很多C语言教材中被称为“万能指针”
既然 void * 指针可以自动的被转换成对应的指针类型,那么再写类型转换代码似乎就“多余”了,反而会让整个C语言代码啰嗦臃肿,损失可读性,尤其是指针类型名很长的时候,例如:
上面的C语言代码显然有重复部分,而且这段重复的C语言代码的“类型转换功能”也是多余的,要是以后需要修改结构体 this_is_test 的名字,还需要修改强制类型转换部分的代码,略显繁琐。与之相对的,下面这行C语言代码明显简洁许多。
下面这行C语言代码明显简洁许多
这么看来,似乎对 malloc() 函数做类型转换“百害而无一利”了,有程序员甚至认为,在C语言程序开发中,调用 malloc() 函数使用类型转换,只是因为不知道类型转换会带来的潜在不利而已。
需要?
不过,也有C语言程序员持反对意见,他们认为,在调用 malloc() 时使用类型转换可以让代码在 C语言和C++之间可移植,有些程序员以为自己在写C语言程序,但是他们实际上还是会用到C++的一些特性。
在 C语言和C++之间可移植
另外,调用 malloc() 函数使用类型转换还可以发现一些潜在的风险,例如有的C语言程序员会在开发中弄混 type * 和 type ** ,如果没有显式的类型转换,这样的错误就会被编译器隐藏掉了。
因此,在对 malloc() 函数的返回值做数据类型转换的过程,本身就是C语言程序员自检代码的过程,这样更加容易在开发阶段就发现 bug。而且,如果C语言程序出现了数据类型相关的错误,调用 malloc() 函数做了类型转换肯定能够更加方便的定位错误。
小结
弄清楚在C语言程序开发中调用 malloc() 函数时,做不做类型转换的各自特点后,应该能够发现其实各有各的好处,那究竟是否需要做类型转换,就在于程序员自己的开发习惯了。
点个赞再走吧
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
MCGS PRO同类对象复用弹窗,公共弹窗,指针变量,指针化
在一般工业设备中,我们有很多个泵,很多个阀,控制原理及界面是一致的,我们只需要为一类设备建立一个界面,通过索引改变指针,指针变量根据索引,读写指定的变量。
1.建立工程
1.1新建一个新工程;
1.2新建二个画面,分别如下图:
1.3 新建变量如下图:
指针变量设置如下图:
2.画面制作
2.1打开泵窗口,建立图素如下:
变量连接指针变量
2.2 打开工艺流程图,新建二个按钮,泵1,泵2
泵1,泵2按钮脚本如下:
工程制作完毕。
3.运行系统
工艺流程图
点击泵1按钮,弹窗如下:
泵1按钮脚本
点击泵2按钮,弹窗如下:
泵2按钮脚本
功能测试完毕。
本工程使用到的函数:
!SetWindow(WndObject,Op)
函数意义: 按照名字操作用户窗口,如打开、关闭、打印
返 回 值: 浮点数= 0,调用正常
参 数: WndObject,用户窗口名
Op,浮点数,操作用户窗口的方法:
= 1,打开窗口并使其可见
= 2,打开窗口并使其不可见
= 3,关闭窗口
= 4,打印窗口
= 5,刷新窗口
实 例: !SetWindow(工况图,1),打开用户窗口“工况图”,并使其可见。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。