【问题标题】:Why does "The C Programming Language" book say I must cast malloc?为什么“The C Programming Language”一书说我必须强制转换 malloc?
【发布时间】:2015-12-15 14:44:54
【问题描述】:

今天我到了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 这本书有许多事实和印刷错误(google K&R 勘误表),它只是在某种程度上与 C90 标准兼容,它没有解决当前的 C 标准,也没有解决自 1990 年以来语言的任何变化. 最糟糕的是,它充满了糟糕的编程实践、糟糕的风格和依赖于指定不当行为的代码。如果你成为一名专业的 C 程序员,你必须忘掉所有这些。
  • ...并将其与Why does the compiler complain when I do not cast the result of malloc? 进行对比所以,对于 C - 不要强制转换。对于 C++ - 强制转换,但不要使用 malloc,因为它不是 C++ - 除非你必须 - 但你不应该 - 除了...AGGGHHHHHHH !!!!!! :-)
  • @Mandrill 你读过我的问题吗?我必须为你编辑我的问题。

标签: c casting malloc kernighan-and-ritchie


【解决方案1】:

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

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

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

无论如何,现在我重新阅读了 p 上的内容。 142,我觉得是 错误的;它的编写方式不仅仅是防御性的 与早期的规则相比,它歪曲了 ANSI 规则。

【讨论】:

  • 所以 malloc 的返回类型是 char 而不是 void。谢谢。
  • 如果没有勘误表印在你旁边的纸上,你不能阅读本书。
  • @Michi - 不,返回类型是 char*,而不是 char。两者有很大的不同。
  • @alk:完全正确。通过阅读 K&R,您正在聆听两位大师的演讲,这很充足 ;-)
猜你喜欢
  • 1970-01-01
  • 2021-09-19
  • 2023-03-17
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多