【问题标题】:pointer from integer without a cast warning来自整数的指针,没有强制转换警告
【发布时间】:2013-10-07 14:16:49
【问题描述】:

有人可以向我解释为什么下面的代码在一个 C 文件中时编译得很好,但是当我将 make_queue_data() 函数放入另一个 C 文件并编译它时,它给了我一个“赋值使来自没有强制转换的整数的指针”警告?

#include <stdlib.h>
#include <stdio.h>

typedef struct pqueue_data_t
{
    int priority;
    void *queue_data;
} pqueue_data_t;

void*
safe_malloc (size_t size)
{
    void *mem_block = NULL;
    if ((mem_block = calloc (1, size)) == NULL) {
        fprintf (stderr, "ERROR: safe_malloc() cannot allocate memory.");
        exit (EXIT_FAILURE);
    }
    return (mem_block);
}

pqueue_data_t * 
make_queue_data(void *data, int priority)
{
    pqueue_data_t *pdata;
    pdata = (pqueue_data_t *) safe_malloc(sizeof(pqueue_data_t));
    pdata->priority = priority;
    pdata->queue_data = data;
    return (pdata);
}

int *
alloc_data (int val)
{
    int *rv = (int *)safe_malloc(sizeof(int));
    *rv = val;
    return (rv);
}

int
main (int argc, char **argv)
{
    pqueue_data_t *temp;
    temp = make_queue_data(alloc_data(34), 0); /* problem line */
    printf("%d\n", *((int *)temp->queue_data));
    return EXIT_SUCCESS;
}

这不是我的全部代码,我只是将相关部分剪切并粘贴到其中。

任何帮助将不胜感激,因为我已经将头撞在墙上几个小时试图找出问题所在..

【问题讨论】:

标签: c pointers casting warnings


【解决方案1】:

可能是(我在这里猜测)因为您在另一个源文件中没有safe_malloc 的原型。

或者这可能是因为您没有在另一个源文件中定义pqueue_data_t(它可能应该在头文件中)。

【讨论】:

    【解决方案2】:

    确保函数原型在使用该函数的所有源文件中都可用。如果您在一个文件中定义一个函数并在另一个文件中使用它,则另一个文件仍然需要知道函数原型。

    当编译器看到一个它不知道原型或定义的函数调用时,它假定该函数具有返回类型int,当你将它分配给一个指针时,编译器会警告你。这也是你永远不应该转换malloc的结果的原因,以防你忘记包含stdlib.h

    【讨论】:

    • 谢谢,我已经改变了 malloc 的演员表,我不知道我为什么首先这样做.. 对于另一个,safe_malloc() 和 make_queue_data() 的函数原型都是实际上在测试源文件中#included的头文件中,但它仍然给我警告,我应该将它们剪切并粘贴到实际的测试文件中吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多