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

在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语言
添加新评论

icon_redface.gificon_idea.gificon_cool.gif2016kuk.gificon_mrgreen.gif2016shuai.gif2016tp.gif2016db.gif2016ch.gificon_razz.gif2016zj.gificon_sad.gificon_cry.gif2016zhh.gificon_question.gif2016jk.gif2016bs.gificon_lol.gif2016qiao.gificon_surprised.gif2016fendou.gif2016ll.gif