今天我到了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
。
但我的问题是:这本书为什么说我应该投吧?
答案 0 :(得分:208)
来自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规则。