【问题标题】:casting void pointers [duplicate]铸造空指针[重复]
【发布时间】:2011-03-26 15:36:17
【问题描述】:

可能的重复:
Do I cast the result of malloc?
Should I explicitly cast malloc()'s return value?

你好,

gcc 4.4.4 c89

通常我不会从 malloc 调用中转换返回结果。

int *int_ptr = NULL;
int_ptr = malloc(sizeof(int));

但是,我在这里读到过,如果你施放它可以隐藏错误。如果显式转换为 int,它如何隐藏错误?

int_ptr = (int*)malloc(sizeof(int));

另外,我正在阅读一本 c 编程书籍,它说从 void 指针(包括来自 malloc 的调用)进行强制转换是一种很好的编程习惯。

什么是好的编程习惯?

int *int_ptr = NULL;
void *ptr = NULL;

int_ptr = ptr;

int_ptr = (int*)ptr;

非常感谢您的建议,

【问题讨论】:

标签: c malloc


【解决方案1】:

如何隐藏错误,如果你 显式转换为 int?

它可以隐藏在调用malloc之前忽略包含stdlib.h的错误。如果没有正确的函数声明,C 编译器可以假定它返回一个int,并且显式转换将掩盖您没有正确调用malloc 的事实。请参阅 comp.lang.c 常见问题解答中的 Q7.6Q7.16

另外,我正在阅读 c 编程 说它很好的书 编程实践从一个 空指针,包括来自的调用 malloc。

这将是一个很好的编程 练习?

在 C 中显式转换 malloc 的结果是没有意义的。它可能会掩盖错误,并且会增加维护负担(如果您决定更改分配的类型,您现在在代码中有一个额外的站点必须更改)。

您唯一应该从void* 执行显式转换的情况是,如果您将代码编译为 C++,因为 C++ 不允许将其作为隐式转换。 (但如果你正在编写 C++ 代码,在这种情况下你应该使用static_cast。)

【讨论】:

  • 问题是:在 C++ 中编码时是否应该使用 malloc(但我想这已经讨论过无数次了)
  • @msiemeri:通常应该避免使用它,但如果您要与现有的 C 代码交互,那并不总是一种选择。
【解决方案2】:

不要将 void* 的返回值转换为 malloc(),除非它是为了让 GCC 在您的环境中保持安静,或者如果它是由同事强制等...

投射或不投射,void* 只是一个内存地址。将其分配给具有类型的变量赋予其意义,避免强制转换使代码更易于阅读。

【讨论】:

  • 您所说的NULL* 是什么?你的意思一定是void*
  • 哈哈哈......我的匆忙把我的帖子弄得一团糟。谢谢,那太傻了。
猜你喜欢
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多