2012-07-29 140 views
0

我构建了一个堆栈数据结构,它有一个peek方法。在主要调用peek时,编译器给我一个warning: initialization makes pointer from integer without a cast警告。以下是我有:链接头文件

stack.h

struct stack_elem { 
    struct stack_elem *next; 
}; 

struct stack { 
    struct stack_elem *top; 
}; 

void stack_init(struct stack *stack); 
int isEmpty(struct stack *); 
struct stack_elem * peak(struct stack *); 

及其实施:

void stack_init(struct stack *stack) { 
    stack->top = NULL; 
} 

int isEmpty(struct stack *stack) { 
    if (stack->top == NULL) 
     return 1; 
    else 
     return 0; 
} 

struct stack_elem * peek(struct stack *stack) { 
    if (isEmpty(stack) == 1) 
     return NULL; 
    else 
     return stack->top; 
} 

在我main.c,我定义堆栈,如下所示:

struct stack stack; 
stack_init(&stack); 

,并呼吁偷看:

struct stack_elem * elem = peek(&stack); 

该行将引发警告。这里奇怪的是我曾经将stack.c导入main.c,并且只用$ gcc main.c进行编译。这绝对没有错误。现在我将导入更改为stack.h,并且我正在编写$ gcc main.c stack.c这会引发警告。运行它也segfaults(它没有预先)。

+0

你可以给所有的源代码吗? – laifjei 2012-07-29 09:05:29

+0

为什么你的声明包含一个声明:'node-> value.character = * p; '? – Aftnix 2012-07-29 09:06:03

+0

@Annix抱歉我修好了。我从emacs拆分屏幕复制它,并且它被错误地复制。 – darksky 2012-07-29 09:09:10

回答

2

变化:

struct stack_elem * peak(struct stack *); 

要:

struct stack_elem * peek(struct stack *); 

:)

+1

该死的 - 这些错误让我想把我的头撞到墙上10次。当它不应该工作时,它正在工作很长时间。非常感谢!我想它需要一双新鲜的眼睛。 – darksky 2012-07-29 09:23:29

3

看起来像PEEK()在.H未声明的,所以编译器假定它是一个int 。 main()在调用它时假设它是一个指针返回类型。

该警告是100%正确的!

3

对我来说,在你的头文件中有一个错字?

struct stack_elem * peak(struct stack *); 

“高峰”,您的实现读取“偷看”。不过,不知道这是否会引起这样的警告。

+1

它会引起警告; 'peek()'被隐含地声明为一个返回'int'的函数,因此转换被警告发生。 – 2012-07-29 09:18:28