警告:整数

时间:2016-10-16 16:12:42

标签: c pointers

问题空间

嗨,大家好,

为什么要对原型函数char *zalloc();进行注释会给出下面的编译错误?

删除原型函数注释后,一切似乎都能正常工作。

示例代码:

#include <stdio.h>

#define ALLOCSIZE 10000

static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf; // allocbuf = &allocbuf[0]

char *fn();
// char *zalloc();

int main()
{
    int a = 100;

    char *c = fn();
    char *d = zalloc(1000000);

    printf("%s\n", c);
    printf("%p\n", d);
}

char *zalloc(int n)
{
    if (allocbuf + ALLOCSIZE - allocp >= n) {
        allocp += n;
        return allocp - n;
    } else
        return 0;
}

void afree(char *p)
{
    if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
        allocp = p;
}

char *fn()
{
    return "foo";
}

编译错误:

example_24.c: In function 'main':
example_24.c:16:12: warning: initialization makes pointer from integer without a cast
  char *d = zalloc(1000000);
            ^
example_24.c: At top level:
example_24.c:22:7: error: conflicting types for 'zalloc'
 char *zalloc(int n)
       ^
example_24.c:16:12: note: previous implicit declaration of 'zalloc' was here
  char *d = zalloc(1000000);

4 个答案:

答案 0 :(得分:2)

如果C编译器检测到它不知道的函数,则假定它返回int

由于zalloc()用于初始化char*,您会收到相关邮件:... makes pointer from integer ...

答案 1 :(得分:2)

    char *d = zalloc(1000000);

在这一行中,您将调用编译器以前从未见过的函数。当发生这种情况时,编译器会假定函数返回int,就像之前已经完成int zalloc(int);一样。

这就是为什么你得到一个关于用一个整数和一个&#34;冲突类型初始化指针(char *d)的警告&#34;稍后当编译器看到实际函数定义时出错。

答案 2 :(得分:1)

在C语言中,您需要在调用它们之前声明您的函数(不需要原型,但至少是非原型声明)。这意味着当您注释掉函数声明时,您的程序将变为无效。

您的编译器的诊断消息具有误导性,因为它们似乎掩盖了主要问题。我猜你的编译器配置不正确,无法遵守现代C规范的要求。

P.S。请注意,BTW,您的两个原始函数声明都是非原型的。您需要显式(void)作为函数参数列表来为无参数函数创建原型声明(参考fn)。

答案 3 :(得分:0)

它不会编译,因为编译器会自动假定一个不是'function-prototyped'的函数将返回一个int。

另外,func原型被认为是一种很好的做法。