为什么《C语言程序设计》这本书说我必须使用强制类型转换来调用malloc函数?

169

今天,我阅读了《C语言程序设计(第2版)Brian W. Kernighan & Dennis M. Ritchie》第167页,发现作者说我必须在使用 malloc 函数时进行类型转换。以下是书中相关部分:

7.8.5 存储管理

malloccalloc 函数用于动态获取内存块。

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进行强制转换

但是我的问题是:这本书为什么要我进行强制转换?


133
因为这本书旧了。 - Oliver Charlesworth
12
因为即使太阳也有黑点,这将是我的答案。换句话说,这本书是错误的。可能是因为该文本早于“void *”语义的出现,并且没有得到更新。请参见此答案 - unwind
8
@Michi 这本书存在许多事实和印刷错误(可搜索K&R勘误表),它只能与C90标准有些相容,而且它没有涉及当前的C标准或自1990年以来该语言的任何变化。最糟糕的是,它充斥着不良编程实践、糟糕的风格和依赖于规范不明确的行为的代码。如果你想成为一名专业的C程序员,就必须摒弃其中的所有内容。 - Lundin
9
与此相比,请参考为什么我没有将malloc的结果转换为指定类型时编译器会发出警告? 所以,对于C语言 - 不要转换。对于C ++ - 转换,但不要使用malloc因为它不是C ++ - 除非必须使用 - 但你不应该 - 除了...啊啊啊啊啊啊啊!!!!! :-) - Bob Jarvis - Слава Україні
2
@Mandrill,你看到我的问题了吗?我为了你不得不编辑了我的问题。 - Michi
显示剩余3条评论
1个回答

228

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

在ANSI C标准出现之前的C语言中,如K&R-1所述,malloc()返回一个char *类型,并且必须在接收变量不是char *类型时进行强制转换。标准C中新增的void *类型使得这些强制转换变得不再必要。

为了避免任何人因无谓地为K&R-2辩护而尴尬,我向Dennis Ritchie询问了对于第142页引用句子的有效性的看法。他回答道:

无论如何,既然我重新阅读了第142页上的内容,我认为它是错误的;它的写法不仅是针对早期规则的防御措施,而且歪曲了ANSI规则。


24
因此,malloc的返回类型是char而不是void。谢谢。 - Michi
11
在勘误表http://web.archive.org/web/20150205025553/http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html中也提到了。 - nos
18
你必须在身边放置印有勘误表的纸张才能阅读这本书。我的翻译意思是:在阅读此书之前,必须将勘误表打印在一张或多张纸上并放在你身旁。 - Lundin
5
@Michi - 不,返回类型是 char*,而不是 char。这两者有很大的区别。 - Pete Becker
20
@alk:没错。通过阅读K&R,您正在聆听两位大师的声音,这已经足够了。;-) (翻译:正是如此。通过阅读K&R,你会听到两位专家的见解,这已经足够了;-)) - Steve Jessop
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接