C - 在多个文件中返回结构指针时出错

时间:2014-07-20 21:38:10

标签: c pointers structure

我正在尝试学习如何将C代码分成多个文件,但这样做时我遇到了错误。

相关代码(以文件分隔):

ex6.h:

#ifndef __ex6_h__
#define __ex6_h__

struct nlist { /* table entry: */
    struct nlist *next; /* next entry in chain */
    char *name; /* defined name */
    char *defn; /* replacement text */
};

#endif

list.c:

#include "ex6.h"

struct nlist *install(char *name, char *defn)
{
    struct nlist *np;
    unsigned hashval;

    if ((np = lookup(name)) == NULL) { /* not found */
        np = (struct nlist *) malloc(sizeof(*np));
        if (np == NULL || (np->name = strdup(name) == NULL)
            return NULL;
        hashval = hash(name);
        np->next = hashtab[hashval];
        hashtab[hashval] = np;
    } else /* already there */
        free((void *) np->defn); /*free previous defn */
    if ((np->defn = strdup(defn)) == NULL)
        return NULL;
    return np;
}

main.c中:

#include "ex6.h"

int main (int argc, char* argv[])
{
    struct nlist *np1;

    np1 = install("This", "That");

    return 0;
}

当我编译这段代码时,我得到了这个:

cc -g main.c list.c -o main
main.c: In function ‘main’:
main.c:10:6: warning: assignment makes pointer from integer without a cast [enabled by default]
  np1 = install("This", "That");
  ^

显然有更多的代码(如果请求将发布),但代码的其他部分似乎工作正常,除了这个片段。此外,当我将“main.c”文件和“list.c”中的代码放入同一个文件时,代码工作正常。

感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

您在头文件中缺少安装功能的声明。这使得编译器假定它返回int而不是指针,这会导致此警告。添加到ex6.h:

struct nlist *install(char *name, char *defn);

答案 1 :(得分:0)

带main的编译单元没有看到函数install的声明。因此,编译器假定默认情况下函数的返回类型为int,并且在此语句中为

np1 = install("This", "That");

将类型int的值分配给指向结构的指针。

你应该在标题" ex6.h"中包含函数声明。因为该函数用于多个编译单元。

答案 2 :(得分:0)

您需要在install中为ex6.h添加声明。类似的东西:

extern struct nlist *install(char *name, char *defn);

如果没有声明,函数的假定返回值为int。编译器会抱怨,因为np1的类型为struct nlist*,并且它会尝试将int分配给np1

当您提供声明时,它知道install的返回类型为struct nlist*。因此,可以将install的返回值分配给np1