casio1374633

导航

 

写了个小程序,在gcc下通过了,找实验室的人加个图形外观,放VC++上以后编译说malloc时候void * 赋值给 struct * 没有转换.


我写的


p = malloc(sizeof(ELEMENT)); 必须写成 p = (*ELEMENT) malloc(sizeof(ELEMENT));


这让我产生了些兴趣,因为在查看书本时候, C圣经上是加了强制转换的.但是另一本权威的C语言教程(也是外国人编写)上,并没有加.


通过资料找到:


====================================================
http://c-faq-chn.sourceforge.net/ccfaq/node103.htm

8.9 为什么有些代码小心地把 malloc 返回的值转换为分配的指针类型



在 ANSI/ISO 标准 C 引入 void * 一般指针类型之前, 这种类型转换通常用于在不兼容指针类型赋值时消除警告 (或许也可能导致转换)。

在 ANSI/ISO 标准 C 下, 这些转换不再需要,而起事实上现代的实践也不鼓励 这样做,因为它们可能掩盖 malloc() 声明错误时产生的重要警告; 参见上面的问题 7.8。 (但是, 因为这样那样的原因, 为求与 C++ 兼容,C 程序中 常常能见到这样的转换。 在 C++ 中从 void* 的明确转换是必须的。)

参考资料: [H&S, Sec. 16.1 pp. 386-7]。
===========================================================



而且在C语言中,某种意义上,不建议使用强制类型转换,因为如果显示的进行了类型转换,可能反而引起麻烦.原因如下:

http://blog.csdn.net/waterwalk/archive/2008/05/28/2490293.aspx

===========================================================================================

http://c-faq.com/malloc/mallocnocast.html

其中重要的是你是否添加了#include <stdlib.h>.而不是进行了强制转换.因为编译器在编译的时候知道类型格式.


而如果你进行了强制转换,编译器就假定你知道自己在做什么而不给出警告信息.

比如:因为malloc的默认返回值是int的.而经过如下操作以后.

char *p = (char *)malloc(10);


int被强制转换为了char, 那么可能引起的错误是显而易见的.

posted on 2013-04-29 20:33  casio1374633  阅读(2512)  评论(0编辑  收藏  举报