为什么“C程序设计语言”一书说我必须投出malloc?

时间:2015-09-18 12:36:32

标签: c casting malloc kernighan-and-ritchie

今天我到了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

但我的问题是:这本书为什么说我应该投吧?

1 个答案:

答案 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规则。