gpt4 book ai didi

c - 为什么 Kernighan 和 Ritchie 包含看似不必要的类型转换?

转载 作者:行者123 更新时间:2023-12-02 06:16:25 29 4
gpt4 key购买 nike

第二版。我正在查看他们在第 6.6 节中的哈希表示例。我发现完整的源代码被转录了 here .这是我困惑的部分:

struct nlist *np;

if((np=lookup(name))==NULL){
np=(struct nlist *)malloc(sizeof(*np));

为什么在最后一行强制转换为 (struct nlist *)?我可以删除它而不会收到任何编译器警告。

我也很困惑

free((void *)np->def);

这些是否旨在以某种方式提高可读性?

最佳答案

转换 malloc 的结果在 C 的一些前 ANSI 方言中是必要的,并且在 K&R2(它涵盖了 1989 年 ANSI C 标准的语言)中保留了这种用法。

本书的勘误表中提到了这一点。我通过 Dennis Ritchie's home page 看到了它,目前不可用(我希望 AT&T 没有永久删除它),但我找到了它 elsewhere :

142(§6.5, toward the end): The remark about casting the return value of malloc ("the proper method is to declare ... then explicitly coerce") needs to be rewritten. The example is correct and works, but the advice is debatable in the context of the 1988-1989 ANSI/ISO standards. It's not necessary (given that coercion of void * to ALMOSTANYTYPE * is automatic), and possibly harmful if malloc, or a proxy for it, fails to be declared as returning void *. The explicit cast can cover up an unintended error. On the other hand, pre-ANSI, the cast was necessary, and it is in C++ also.

关于c - 为什么 Kernighan 和 Ritchie 包含看似不必要的类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29836054/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com