本文概述了旧文章的内容,并总结了malloc返回值的三种变革方式,较全面地总结了各自的应用范围。
1 .原文内容向malloc的三种变革方式
3 .各自的应用范围
以前有篇文章叫《C/C++ 误区 —— 强制转换 malloc() 的返回值》。
文章的大致内容如下
1. malloc函数位于或头文件中,而不是。
2.c语言最初没有void型,所以使用char*表示通用指针。
/* theolddeclarationofmalloc */char * malloc (size ); char*p=malloc(size*sizeof ) p ); /*是的,不需要转型。 */T1*P1=malloc(size1*sizeof ) P1 ) ); /*(T1!=char )不能。 char*无法隐式转换为T1**/T2*P2=(T2* ) malloc (size2* sizeof (p2 ) )。 /*(T2!=char )是,类型转换() /
3 .由于在c语言中引入了void类型,规定了void*可以用来表示通用指针,并且void*可以隐式地转换为任意指针类型。
/* thenewdeclarationofmalloc */void * malloc (size ); char*p=malloc(size*sizeof ) p ); /*也可以。 void*可以隐式转换为任何指针类型*/t1*p1=malloc(size1*sizeof ) p1 )。 /*现在,void*可以隐式转换为任何指针类型*/t2*p2=(t1* ) malloc (size2* sizeof (p2 ) )。 /*还可以,但是已经*/
在引入void后的c语言中,使用强制转换既是画蛇添足,也影响代码维护。
然后他说这是丙/丙的误区。
原文概述结束,开始说这篇文章的内容:
malloc返回值的转换大致分为以下三种方法。
1 .仅限c
/* legalonlyinC*/
/*新建头文件*/t*p=malloc(size*sizeof ) p ); //T!=void */
/*旧头文件*
t*p=(t* ) malloc ) size*sizeof ); //T!=void */
2 .仅限c
c支持void,但不允许void*隐式转换为任意类型的指针,需要static_cast。
//legalonlyinC //新头文件t * p=static _ cast (malloc (size * sizeof ) p ) )//旧头文件(现在有此编译器吗? (t*p=reinterpret_cast(malloc ) size*sizeof ) ); //当然在c中T*p=newT[size]; //或STD :3360向量(大小); //但这不是文章讨论的重点
3 .在丙/丙
/* legalinbothcandc *//* legalinbothnewandoldheader */t * p=(t * ) malloc (尺寸*尺寸) p );
第一种转换为新头文件的方式,如代码第1行所述,仅在c编译器中合法。
因为c不支持从void*到其他指针类型的隐式转换。
所以,原文章说这是C/C的误区,不准确。
这只是(引入void类型后) c语言中的“非必需”动作,是否存在误解值得考虑。
第二种转换为新旧头文件的方式,如代码第1行所述,仅在c编译器中合法。
因为c编译器不知道static_cast或reinterpret_cast。
第三,中庸的写法。
正如代码第1行所述,此代码无论是c编译器、c编译器、新头文件还是旧头文件,都是合法代码。 是移植性最高的代码。
因为支持代码中使用的(c样式)模型转换,malloc——C/C。
所以,这种写法并不一定画错别字或蛇足。
因为代码的作者可能比原始文章的作者对可移植性(c和c新旧编译器)有更多的看法。
posted on 2009-03-0610336016 own waterloo阅读(3683 )评论)4)编辑收藏参考