【发布时间】: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