为什么这本书说我必须施放malloc?

Mic*_*chi 152 c malloc casting kernighan-and-ritchie

今天我到了The C Programming Language(第二版Brian W. Kernighan和Dennis M. Ritchie)的167页,发现作者说我必须演员.这是本书的一部分:malloc

7.8.5存储管理

函数malloc和calloc动态获取内存块.

void *malloc(size_t n)
Run Code Online (Sandbox Code Playgroud)

返回指向未初始化存储的n个字节的指针,如果无法满足请求,则返回NULL.

void *calloc(size_t n, size_t size)
Run Code Online (Sandbox Code Playgroud)

为具有指定大小的n个对象的数组返回指向足够可用空间的指针,如果无法满足请求,则返回NULL.存储初始化为零.malloc或calloc返回的指针对于有问题的对象具有正确的对齐方式,但必须将其强制转换为适当的类型,如

int *ip;
ip = (int *) calloc(n, sizeof(int));
Run Code Online (Sandbox Code Playgroud)

我已经知道malloc(和它的族)返回类型void*,并且有很好的解释为什么不进行转换malloc.

但我的问题是:为什么这本书说我应该施展它?

Dav*_*eri 207

来自http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm:

在ANSI-C之前 - 如K&R-1中所述 - malloc()返回a char * 并且必须在接收变量不是a的所有情况下转换它的返回值char *.void *标准C中的新类型使得这些扭曲变得不必要.

为了拯救任何人不必要地躲避K&R-2辩护的尴尬,我向丹尼斯·里奇询问了一个意见,我可以引用上面引用的第142页上述句子的有效性.他回答说:

无论如何,现在我重读了p上的内容.142,我认为这是错的; 它是以这样的方式编写的,它不仅仅是对早期规则的防御,它歪曲了ANSI规则.

  • 所以malloc的返回类型是**char**而不是**void**.谢谢. (22认同)
  • @alk:确切地说.通过阅读K&R,你正在听两个大师,这是充足的;-) (20认同)
  • 如果没有在您旁边的纸张上打印勘误表,您不得阅读本书. (18认同)
  • 它也在勘误表中提到http://web.archive.org/web/20150205025553/http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html (10认同)
  • @Michi - 不,返回类型是`char*`,而不是`char`.两者截然不同. (3认同)
  • @PeteBecker先生,这是一个错字,我知道,我在我的问题中做了解释.关于malloc的返回类型是**void*** (2认同)
  • @Michi 原始 C 语言中没有“void”(或“void*”)。当时使用“char*”作为通用指针类型。 (2认同)