我已经在这个问题上工作了大约一个星期,我已经查找了大量“不兼容的指针类型”警告解决方案,但我仍然对如何解决这个编译错误感到困惑。
我收到错误说:
char_stack_interface.c: In function ‘pop_char’:
char_stack_interface.c:32: warning: passing argument 2 of ‘pop’ from incompatible pointer type
char_stack_interface.c: In function ‘top_char’:
char_stack_interface.c:43: warning: passing argument 2 of ‘top’ from incompatible pointer type
这是我的代码:
char_stack_interface.h:
#ifndef _CHAR_STACK_INTERFACE_H
#define _CHAR_STACK_INTERFACE_H
#include "stack.h"
extern status push_char(stack *p_s, char c);
extern status pop_char (stack *p_s, char *p_c);
extern status top_char (stack *p_s, char *p_c);
#endif
stack.h:
#ifndef _STACK_H
#define _STACK_H
#include "globals.h"
ABSTRACT_TYPE(stack);
extern status init_stack (stack *p_S);
extern bool empty_stack(stack *p_S);
extern status push (stack *p_S , generic_ptr data);
extern status pop (stack *p_S , generic_ptr *p_data);
extern status top (stack *p_S , generic_ptr *p_data);
#endif
char_stack_interface.c:
#include <stdio.h>
#include <stdlib.h>
#include "char_stack_interface.h"
#include "stack.h"
status push_char(stack *p_s, char c)
{
char *p_c = NULL;
p_c = (char *) malloc(sizeof(char));
if (p_c == NULL)
return ERROR;
*p_c = c;
if (push(p_s, p_c) == ERROR) {
free(p_c);
return ERROR;
}
return OK;
}
status pop_char (stack *p_s, char *p_c)
{
char *p_data;
if (pop(p_s, p_data) == ERROR)
return ERROR;
*p_c = *p_data;
free(p_data);
return OK;
}
status top_char (stack *p_s, char *p_c)
{
char *p_data;
if (top(p_s, &p_data) == ERROR)
return ERROR;
*p_c = *p_data;
return OK;
}
答案 0 :(得分:2)
无论generic_ptr类型是什么,显然编译器无法自动将'char *'类型转换为通用ptr类型。尝试将你的第二个arg的明确案例用于pop和top例如:
pop(p_s,(generic_ptr)p_data)
答案 1 :(得分:2)
假设generic_ptr
(通常是这种情况):
typedef void* generic_ptr;
然后pop
是:
extern status pop (stack *p_S , void **p_data);
你称之为:
pop(stack*, char*);
因此,您将char*
参数传递给void**
,该参数来自无效的指针类型。根据{{1}}中指针的处理方式,您必须将指针传递给指针和/或明确告诉编译器如何使用显式转换处理该情况。