今天我到了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。
malloc
因为它不是 C++ - 除非你必须 - 但你不应该 - 除了...AGGGHHHHHH !!!!!! :-)
从 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 规则。
char*
,而不是char
。两者有很大不同。