警告:从不同大小的整数转换为指针

时间:2013-04-21 19:11:52

标签: c pointers types casting

我写了以下代码:

struct DVDARRAY
{
    int length;
    pDVD* dvds;
};

typedef struct DVDARRAY DVDARRAY_t;

//...
int main() 
{
    int i;
    char c;
    DVDARRAY_t* dvds;
    poDAOproperties props;
    props = get_dao_properties();
    dvds = (DVDARRAY_t*) DVDDAO_read_raw_filter(props, "id = 1");
    printf("title->: %s", dvds->dvds[0]->title);
}

并在另一个文件中定义以下内容:

DVDARRAY_t* DVDDAO_read_raw_filter(poDAOproperties properties, char* filter)
{
    DVDARRAY_t *dvds;
    // ...some code...
    dvds = malloc(sizeof(DVDARRAY_t));
    // ...some code...
    return dvds;
}

现在我的问题是:当我尝试编译这些文件时,我收到以下警告:

src/main.c: In Funktion »main«:
src/main.c:80:9: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]

main.c的第80行就是那一行:

dvds = (DVDARRAY_t*) DVDDAO_read_raw_filter(props, "id = 1");

我该怎么办?

1 个答案:

答案 0 :(得分:2)

您没有列出上面的文件名,因此我只需将其称为main.cdvd.c

main.c中,您调用其他未声明的函数DVDDAO_read_raw_filter。这告诉编译器假设函数存在,具有未知(但是固定)的参数集,并且返回值为int

dvd.c中,您使用固定(和已知)参数定义函数DVDDAO_read_raw_filter,返回类型DVDARRAY_t*。 (大概你必须首先重复DVDARRAY_t的定义。)

请注意,main.c认为某些内容与DVDDAO_read_raw_filter不符,即它返回类型为int。这导致您的编译时诊断。幸运的是(你可以自己决定这是好运还是坏运气:-))尽管存在这种错误的信念,该计划仍然成功运行。

要解决此问题,请在调用之前告诉main.c该函数,即声明它。您还可以通过将-Wimplicit-function-declaration添加到编译时标志来从gcc获得更明确的警告。

通常,将struct定义,typedef和函数声明放入头文件(例如dvd.h)然后#include是个好主意使用定义和声明的各种C源文件中的标头。这样编译器可以将函数声明与函数定义进行比较,并且您不需要在多个struct文件中重复typedef s的内容和.c的名称。