为什么《The C Programming Language》一书说我必须铸造 malloc?

Why does "The C Programming Language" book say I must cast malloc?

提问人:Michi 提问时间:9/18/2015 最后编辑:RaedwaldMichi 更新时间:3/12/2020 访问量:16470

问:

今天,我翻到了《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 个对象的数组的足够可用空间,如果 无法满足请求。存储初始化为零。 malloc 或 calloc 返回的指针与相关对象具有正确的对齐方式, 但它必须被强制转换为适当的类型,如

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

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

但我的问题是:为什么书上说我应该选角?

C 演员 Malloc Kernighan-and-Ritchie

评论

133赞 Oliver Charlesworth 9/18/2015
因为这本书很旧。
12赞 unwind 9/18/2015
因为即使是太阳也有它的黑点,这将是我的答案。换句话说,这本书是错误的。可能是文本早于 的语义,并且没有更新。另请参阅此答案void *
8赞 Lundin 9/18/2015
@Michi 这本书有很多事实和印刷错误(谷歌K&R勘误表),它只是在某种程度上与C90标准兼容,它没有解决当前的C标准,也没有解决自1990年以来语言的任何变化。最糟糕的是,它充满了糟糕的编程实践、糟糕的风格和依赖于指定不当行为的代码。如果你成为一名专业的 C 程序员,你必须忘记所有这些。
9赞 Bob Jarvis - Слава Україні 9/19/2015
...并将其与为什么编译器在我不强制转换 malloc 的结果时抱怨?所以,对于 C - 不要投射。对于 C++ - 强制转换,但不要使用,因为它不是 C++ - 除非你必须 - 但你不应该 - 除了......呜!!!!呜:-)malloc
2赞 Michi 9/19/2015
你@Mandrill读过我的问题吗?我不得不为你编辑我的问题。

答:

228赞 David Ranieri 9/18/2015 #1

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

在 ANSI C 之前(如 K&R-1 中所述)中,malloc() 返回 a,并且在 接收变量也不是 .新类型 标准 C 使这些扭曲变得不必要。char *char *void *

为了让任何人免于不必要地跳到 为K&R-2辩护,我向丹尼斯·里奇(Dennis Ritchie)征求了我可以的意见 引述第142页引用的上述句子的有效性。他 回答:

无论如何,现在我重读了第 142 页的内容,我认为它是 错;它的写作方式不仅仅是防御性的 与早期的规则相反,它歪曲了 ANSI 规则。

评论

24赞 Michi 9/18/2015
因此,malloc 的返回类型是 char 而不是 void。谢谢。
18赞 Lundin 9/18/2015
如果没有印在你旁边的纸上的勘误表,你就不能阅读这本书。
5赞 Pete Becker 9/18/2015
@Michi - 否,返回类型是 ,而不是 。两者截然不同。char*char
20赞 Steve Jessop 9/18/2015
@alk:没错。通过阅读K&R,您正在聆听两位大师,这已经足够了;-)