C 警告:初始化将指针从整数转换为不带强制转换的整数

C 警告:初始化将指针从整数转换为不带强制转换的整数,c,pointers,C,Pointers,我只想把事情简单化: 以下是我构建的函数,它将创建一个新的dnode: struct dnode *dnode_create() { return calloc(1, sizeof(struct dnode)); } 我这样称呼它: struct dnode *newnode = dnode_create(); 我不明白这是怎么涉及integer的?无论是calloc还是dnode\u create在您尝试使用它时都没有看到原型 这意味着它假定返回类型为int,因此会

我只想把事情简单化:

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

struct dnode *dnode_create() {
        return calloc(1, sizeof(struct dnode));
    }
我这样称呼它:

struct dnode *newnode = dnode_create();

我不明白这是怎么涉及integer的?

无论是
calloc
还是
dnode\u create
在您尝试使用它时都没有看到原型

这意味着它假定返回类型为
int
,因此会显示警告消息

要确保查看到
calloc
的原型,请包括
stdlib.h
头文件

如果是
dnode\u create
,您必须自己完成,方法如下:

  • 在使用之前定义函数(在给定的源文件中);或
  • 在使用原型之前声明原型
在此基础上进行扩展,假设它们以这种方式在单个翻译单元(简单地说,是源文件)中排序,那么这两种方法都可以工作。第一:

或:


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

lemme guess;使用visual studio?啊。C99去掉了隐式int,但gcc仍然允许。所以你的意思是,如果我切换到另一个编译器,它可能不会对此抱怨?可能是@LidongGuo的重复:这在两个方面是错误的。首先,它没有解决这个问题。第二,您从未在C中强制转换malloc的返回值。这没有任何好处,它实际上可以隐藏错误(这里遇到的错误就是这样发生的)。您建议引入一个更严重的错误来消除警告。我应该像(struct dnode*)一样使用calloc?@Nob,不,不要在C中使用
malloc/calloc
,它可以隐藏某些细微的错误。相反,请确保在使用点定义了原型。“使用前声明原型”是什么意思?@Nob,请参阅更新。考虑到您包含了stdlib.h,这可能是您自己的功能。很抱歉,我仍然感到困惑。第一个不是和我的一样吗?或者我必须在花括号内使用它?
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));
}