当前位置:  开发笔记 > 编程语言 > 正文

对malloc返回的指针进行类型转换是一种更好的做法吗?

如何解决《对malloc返回的指针进行类型转换是一种更好的做法吗?》经验,为你挑选了4个好方法。

对于下面的C代码,比较int指针a和b的定义;

#include 
#include 

int main()
{
  int *a=malloc(sizeof(int));
  int *b=(int *)malloc(sizeof(int));
  return(0);
}

以任何方式更好地类推由malloc函数返回的void类型的指针?或者在分配到左侧的int指针时是自动类型化的吗?在哪种情况下,如果有的话,它是否可以证明是必要的而不仅仅是强制性的?

请说明隐式类型转换,右侧类型转换为左侧类型,是否适用于此处.



1> Brian R. Bon..:

C语言不需要强制转换,但是对于C++兼容性,您可能需要强制转换.这是C不是C++子集的地方之一.

以下将用C语言编译,但不能用C++编译:

int *a=malloc(sizeof(int));

以下将在C和C++中编译:

int *b=(int *)malloc(sizeof(int));


对我来说,在.c文件中投射malloc有点像说外国口音.
严格要好得多,因为它可以避免更多的错误.
C++对指针如何转换更为严格的原因之一是因为指针在向上和向下层次化时可能会发生变化.
@布赖恩.但哪种方式更"严格"?如果你添加了强制转换,然后粘贴到C++中,现在一个可疑的malloc()行将默默编译,这可能是坏的.我相信你*希望*C++编译器标记malloc()行以供人类关注."严格"没有相对于C/C++的定义含义,但我可以看到一个论证,即没有强制转换.

2> DigitalRoss..:

不,是的,从不

有人投了指针,我没有.

是的,类型转换"自动"发生

它在C中永远不必要.

以一种奇怪的方式,转换结果会影响 C++的可移植性.从C++引用的模块很可能被编译为C,在这种情况下它无关紧要.但是如果代码以某种方式被复制并粘贴到C++中,我认为你希望每个这样的行被标记,因为在C++中调用malloc()的代码行是一个可疑的LoC.

在某种程度上,这是早期K&R C的延续,没有这种类型void,所以malloc()返回了char *.现在,你需要做演员表.因此,铸造的设计模式malloc()开发并影响了编写下一组代码的所有人,并且人们仍然在阅读这些代码体,并将模式向前推进.但C89无效,所以是时候简化代码了.

根据它的确切方式,演员可能会违反DRY(又名DIE).正如Chris Lutz指出的那样,它会不必要地降低抽象级别.由于在开始的C程序中并不完全是天价,我宁愿不要失去我们所拥有的水平.


他们是对的.我的观点仅仅是你真的应该在不太可能的复制并粘贴到C++场景中给予每个malloc()线人的注意,所以让这些行不仅仅是静默编译好像一切都很好就更好了.
对我而言,杀手是能够以最小的努力消除改变`c`类型的能力:在`float*arr =(float*)malloc(10);`我们必须将两个`float`s'改为`double `如果我们需要更高的精度,如果我们后来`realloc()`编辑那个数组并忘记改变那里的演员怎么办?

3> David Thornl..:

简而言之:

如果你已经包含了stdlib.h,那么演员阵容绝对没有,应该被删除.毕竟,您已经指定了类型.

如果你还没有,那么演员将掩盖错误,这是不好的.

切勿在C代码中使用该转换.

在C++中,强制转换是必要的,因为C++不允许在void *其他指针类型之间进行隐式转换.另一方面,在C++中,有比使用容器类更好的东西malloc(),比如new容器类.

编写将在其中编译的代码毫无意义.你应该总是知道你正在写什么语言,并且在子集中写作会强迫你使用一种在任何一种语言中都较差的结构.我熟悉的C++编译器也将编译C代码,C++中有明确的规定可以轻松地与C代码链接.如果您将其编译为C++,则错误消息(没有强制转换)将指出您的错误.

所有演员都会做的是掩盖可以在其他地方咬你的错误.它不会做任何有用的事情.不要这样做.



4> Eli Bendersk..:

在C中,演员阵容是不必要的.malloc返回a void*,C标准声明:

指向void的指针可以转换为指向任何不完整或对象类型的指针.指向任何不完整或对象类型的指针可能会转换为指向void的指针并再次返回; 结果应该等于原始指针.

此外,K&R2说:

任何指向对象的指针都可以转换为void*类型而不会丢失信息.如果结果转换回原始指针类型,则恢复原始指针.与Par.A.6.6中讨论的指针到指针转换(通常需要显式转换)不同,指针可以分配给void*类型的指针,也可以与它们进行比较.

关于C++兼容性可能有一点,因为在C++中,强制转换是强制性的.然而,恕我直言,这几乎不相关,因为惯用的C++要求使用new而不是malloc反正.


@Brian:如果您的C++程序需要使用您的C代码,它只能_use_它.没有_porting_它到C++.所以eliben评论源代码与C++的兼容性不是问题是正确的.
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有