今天我翻到了《C程序设计语言》第二版167页Dennis M. Ritchie),发现作者说我必须出演malloc
。以下是书中的部分内容:
7.8.5 Storage Management函数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*,并且有很好的解释为什么不转换malloc
。
但我的问题是:为什么书上说我应该投?
From http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm:
在ansi之前的C中——如K&R-1中所述——malloc()返回一个
char *
在所有情况下都必须强制转换它的返回值接收变量也不是char *
。新的void *
类型在标准C不需要这些扭曲。为了避免任何人不必要地跳到为K&R-2辩护时,我向丹尼斯·里奇征求意见引用上面142页引用的句子的有效性。他回答:
无论如何,现在我重读了第142页的内容,我认为它是错误的;它的写作方式不仅仅是防御性的