有人可以向我解释为什么下面的代码在一个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;
}
这不是我的全部代码,我只是将相关部分剪切并粘贴到其中。
任何帮助都会非常感激,因为我一直在对着这堵墙砸了几个小时试图找出问题所在。
答案 0 :(得分:3)
可能(我猜这里),因为你在其他源文件中没有safe_malloc
的原型。
或可能是因为您没有在其他源文件中定义pqueue_data_t
(它可能应该在头文件中)。
答案 1 :(得分:1)
确保函数原型在所有使用该函数的源文件中都可用。如果在一个文件中定义一个函数并在另一个文件中使用它,则另一个文件仍然需要知道函数原型。
当编译器看到一个函数调用,它知道它没有原型或它的定义时假设函数有一个返回类型int
,当你将它指定给一个指针时,编译器会向你发出警告。这也是您永远不应该将malloc
的结果投射到以防忘记包含stdlib.h
的原因。