16

C语言程序开发中,调用 malloc() 函数时究竟需不需要做类型转换?

 3 years ago
source link: https://blog.popkx.com/c%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%8F%91%E4%B8%AD-%E8%B0%83%E7%94%A8-malloc-%E5%87%BD%E6%95%B0%E6%97%B6%E7%A9%B6%E7%AB%9F%E9%9C%80%E4%B8%8D%E9%9C%80%E8%A6%81%E5%81%9A%E7%B1%BB/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

C语言程序开发中,调用 malloc() 函数时究竟需不需要做类型转换?

发表于 2019-07-31 21:07:36   |   已被 访问: 356 次   |   分类于:   C语言   |   暂无评论

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

void *malloc(size_t size);
void free(void *ptr);

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

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

读者应该注意到,malloc() 函数的返回值是 void * 指针型的。看过我之前文章的读者应该明白,在C语言中,void * 指针是不能够直接用于索引数据的,因此在实际的C语言程序开发中,程序员调用 malloc() 函数时,一般都会定义其他类型的指针,例如:

char *cp = malloc(size);

读者看到这里,可能会产生疑问:malloc() 函数的返回值类型是 void * 指针型,而变量 cp 则是 char * 指针型,似乎出现了类型不匹配的情况,是否需要类型转换呢?事实上,的确不少C语言程序员在调用 malloc() 函数时会使用类型转换:

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

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

有程序员认为,C语言经过这么多年的发展,对于 malloc() 函数,如今似乎不再需要类型转换了,因为 void * 指针会自动的并且安全的被转换为对应类型的指针。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语言代码明显简洁许多。

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

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

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

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

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

阅读更多:   C语言


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK