警告:指针类型不兼容

时间:2012-02-17 16:50:16

标签: c pointers types

我已经在这个问题上工作了大约一个星期,我已经查找了大量“不兼容的指针类型”警告解决方案,但我仍然对如何解决这个编译错误感到困惑。

我收到错误说:

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;
}

2 个答案:

答案 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}}中指针的处理方式,您必须将指针传递给指针和/或明确告诉编译器如何使用显式转换处理该情况。