为什么“ The C Programming Language”这本书说我必须转换malloc?


158

今天,我到达了C编程语言(第二版Brian W. Kernighan和Dennis M. Ritchie)的167页,发现作者说我必须强制转换。这是本书的一部分:malloc

7.8.5存储管理

函数malloc和calloc动态获取内存块。

void *malloc(size_t n)

返回一个指向n字节未初始化存储的指针,如果无法满足请求,则返回NULL。

void *calloc(size_t n, size_t size)

返回一个指向足够的可用空间的指针,该指针用于指定大小的n个对象的数组;如果无法满足请求,则返回NULL。存储初始化为零。由malloc或calloc返回的指针与所讨论的对象具有正确的对齐方式,但必须将其强制转换为适当的类型,如

int *ip;
ip = (int *) calloc(n, sizeof(int));

我已经知道malloc(及其家族)返回类型void *,并且有很好的解释为什么不强制转换malloc

但是我的问题是:为什么这本书说我应该抛弃它?


125
因为这本书很旧。
奥利弗·查尔斯沃思

12
因为即使太阳也有黑点,所以这就是我的答案。换句话说,这本书是错误的。该文本可能早于的语义void *,并且未更新。另请参阅此答案
放松

8
@Michi这本书有许多事实和印刷错误(google K&R勘误表),仅与C90标准兼容,它不涉及当前的C标准,也不自1990年以来对语言进行任何更改。最糟糕的是,这本书充满了不良的编程习惯,不良的样式和代码,它们依赖于行为不明确的行为。如果您成为专业的C程序员,则必须不了解所有这些内容。
隆丁

8
...并将其与为什么当我不转换malloc的结果时编译器会抱怨吗?因此,对于C-请勿投射。对于C ++-强制转换,但不要使用,malloc因为它不是C ++-除非必须这样做-但您不应该-除了... AGGGHHHHHH !!!!! :-)
鲍勃·贾维斯

2
@Mandrill你读过我的问题吗?我必须为您编辑我的问题。
Michi

Answers:


215

http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm

在ANSI C之前的版本中-如K&R-1中所述-malloc()返回a,char * 并且在接收变量也不是a的所有情况下,都必须转换其返回值char *void *标准C中的新类型使这些扭曲变得不必要。

为了使任何人免于不必要地跳入K&R-2辩护的尴尬,我请丹尼斯·里奇(Dennis Ritchie)提出意见,我可以引用上面第142页中引用的句子的有效性。他回答:

无论如何,现在我重新阅读了p的内容。142,我认为这是错误的;它以这样的方式编写:它不仅防御早期的规则,而且歪曲了ANSI规则。


23
因此,malloc的返回类型为char而不是void。谢谢。
Michi 2015年


18
如果没有勘误印在您旁边的纸上,您就不能读这本书。
伦丁

4
@Michi-不,返回类型是char*,不是char。两者截然不同。
皮特·贝克尔

20
@alk:完全正确。通过阅读K&R,您正在听两个大师;这很充实;-)
史蒂夫·杰索普
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.