既然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

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。