ChatGPT解决这个技术问题 Extra ChatGPT

为什么“The C Programming Language”一书说我必须强制转换 malloc?

今天我到了The C Programming Language (second edition 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*there are good explanations why not to cast malloc

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

因为书很旧。
因为即使是太阳也有黑点,这就是我的答案。换句话说,这本书是错的。可能是文本早于 void * 的语义,并且没有更新。另见this answer
@Michi 这本书有很多事实和印刷错误(谷歌 K&R 勘误表),它只是在某种程度上与 C90 标准兼容,它没有解决当前的 C 标准,也没有解决自 1990 年以来语言的任何变化。最糟糕的是,它充满了糟糕的编程实践、糟糕的风格和依赖于指定不当行为的代码。如果你成为一名专业的 C 程序员,你必须忘掉所有这些。
...并将其与 Why does the compiler complain when I do not cast the result of malloc? 进行对比因此,对于 C - 不要强制转换。对于 C++ - 强制转换,但不要使用 malloc 因为它不是 C++ - 除非你必须 - 但你不应该 - 除了...AGGGHHHHHH !!!!!! :-)
@Mandrill 你读过我的问题吗?我不得不为你编辑我的问题。

a
alk

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

在 ANSI C 之前——如 K&R-1 中所述——malloc() 返回一个 char *,并且在所有接收变量不是 char * 的情况下都必须转换其返回值。标准 C 中的新 void * 类型使这些扭曲变得不必要。为了避免任何人不必要地为 K&R-2 辩护而感到尴尬,我向丹尼斯·里奇征求意见,我可以引用上面第 142 页中引用的句子的有效性。他回答:无论如何,既然我重读 p 上的内容。 142,我觉得不对;它的编写方式不仅是为了防御早期的规则,而且还歪曲了 ANSI 规则。


所以 malloc 的返回类型是 char 而不是 void。谢谢你。
如果没有勘误表印在你旁边的纸上,你就不能阅读这本书。
@Michi - 不,返回类型是 char*,而不是 char。两者有很大不同。
@alk:完全正确。通过阅读 K&R,您正在聆听两位大师的演讲,这已经足够了 ;-)

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅