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动态获取内存块.
Run Code Online (Sandbox Code Playgroud)void *malloc(size_t n)
返回指向未初始化存储的n个字节的指针,如果无法满足请求,则返回NULL.
Run Code Online (Sandbox Code Playgroud)void *calloc(size_t n, size_t size)
为具有指定大小的n个对象的数组返回指向足够可用空间的指针,如果无法满足请求,则返回NULL.存储初始化为零.malloc或calloc返回的指针对于有问题的对象具有正确的对齐方式,但必须将其强制转换为适当的类型,如
Run Code Online (Sandbox Code Playgroud)int *ip; ip = (int *) calloc(n, sizeof(int));
我已经知道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规则.