提问人:Michi 提问时间:9/18/2015 最后编辑:RaedwaldMichi 更新时间:3/12/2020 访问量:16470
为什么《The C Programming Language》一书说我必须铸造 malloc?
Why does "The C Programming Language" book say I must cast malloc?
问:
今天,我翻到了《C编程语言》(第二版,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 个对象的数组的足够可用空间,如果 无法满足请求。存储初始化为零。 malloc 或 calloc 返回的指针与相关对象具有正确的对齐方式, 但它必须被强制转换为适当的类型,如
int *ip; ip = (int *) calloc(n, sizeof(int));
我已经知道(及其族)返回类型 void*,并且有很好的解释为什么不强制转换 malloc
。malloc
但我的问题是:为什么书上说我应该选角?
答:
228赞
David Ranieri
9/18/2015
#1
从 http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm:
在 ANSI C 之前(如 K&R-1 中所述)中,malloc() 返回 a,并且在 接收变量也不是 .新类型 标准 C 使这些扭曲变得不必要。
char *
char *
void *
为了让任何人免于不必要地跳到 为K&R-2辩护,我向丹尼斯·里奇(Dennis Ritchie)征求了我可以的意见 引述第142页引用的上述句子的有效性。他 回答:
无论如何,现在我重读了第 142 页的内容,我认为它是 错;它的写作方式不仅仅是防御性的 与早期的规则相反,它歪曲了 ANSI 规则。
评论
24赞
Michi
9/18/2015
因此,malloc 的返回类型是 char 而不是 void。谢谢。
11赞
nos
9/18/2015
勘误表中也提到了它 web.archive.org/web/20150205025553/http://cm.bell-labs.com/cm/...
18赞
Lundin
9/18/2015
如果没有印在你旁边的纸上的勘误表,你就不能阅读这本书。
5赞
Pete Becker
9/18/2015
@Michi - 否,返回类型是 ,而不是 。两者截然不同。char*
char
20赞
Steve Jessop
9/18/2015
@alk:没错。通过阅读K&R,您正在聆听两位大师,这已经足够了;-)
评论
void *
malloc