【问题标题】:warning: initialization makes pointer from integer without a cast警告:初始化使指针从整数而不进行强制转换
【发布时间】:2013-09-07 09:51:51
【问题描述】:

我会保持简单:

这是我构建的函数,它将创建一个新的 dnode:

struct dnode *dnode_create() {
        return calloc(1, sizeof(struct dnode));
    }

我是这样称呼它的:

struct dnode *newnode = dnode_create();

我不明白这与整数有什么关系?

【问题讨论】:

  • 让我猜;使用视觉工作室?
  • 啊。 C99 取消了隐式 int,但 gcc 仍然允许它。
  • 所以你的意思是如果我切换到另一个编译器它可能不会抱怨这个?
  • @LidongGuo:这在两个方面是错误的。首先,它没有解决这里的问题。其次,您永远不会在 C 中转换 malloc 的返回值。没有任何好处,它实际上可以隐藏错误(这里遇到的错误就是这样发生的)。您打算引入一个更严重的错误来消除警告。

标签: c pointers


【解决方案1】:

当您尝试使用 callocdnode_create 时,都没有看到原型。

这意味着它假定返回类型为 int,因此是您的警告消息。

为确保calloc 的原型可见,请包含stdlib.h 头文件。

如果是dnode_create,你必须自己做,通过:

  • 在使用之前定义函数(在给定的源文件中);或
  • 在使用原型之前声明它。

进一步扩展,假设它们在单个翻译单元(简单地说,源文件)中以这种方式排序,这两种方法都可以工作。第一:

struct dnode *dnode_create (void) {         // declare & define
    return calloc(1, sizeof(struct dnode));
}
:
{   // inside some function
    struct dnode *newnode = dnode_create(); // use
}

或者:

struct dnode *dnode_create (void);          // declare
:
{   // inside some function
    struct dnode *newnode = dnode_create(); // use
}
:
struct dnode *dnode_create (void) {         // define
    return calloc(1, sizeof(struct dnode));
}

您还会注意到,在上述两种情况下,我在函数声明中都使用了void。这(无参数)和空参数列表(不确定数量的参数)之间存在细微差别。如果你真的想要一个无参数函数,你应该使用前者。

【讨论】:

  • 我应该像 (strcut dnode*) 一样投射 calloc 吗?
  • @Nob,不,不要在 C 中强制转换 malloc/calloc,它可以隐藏某些细微的错误。相反,请确保在使用时定义原型。
  • 我确实包含了 stdlib.h。 “在使用原型之前声明原型”是什么意思?
  • @Nob,查看更新。假设你包含stdlib.h,它可能是你自己的函数。
  • 抱歉我还是一头雾水。第一个不是和我的一样吗?或者我必须在大括号内使用它?
猜你喜欢
  • 2012-10-30
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多