0

メソッドを持つスタックデータ構造を構築しましたpeek。mainwarning: initialization makes pointer from integer without a castを呼び出すと、コンパイラから警告が表示されます。peekこれが私が持っているものです:

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も実行されます(以前は実行されていませんでした)。

4

3 に答える 3

3

peek()は.hで宣言されていないように見えるため、コンパイラはそれがintであると想定しています。main()は、それがポインタの戻り型であると想定して呼び出しています。

警告は100%正しいです!

于 2012-07-29T09:11:45.197 に答える
3

ヘッダーファイルにタイプミスがあるようですが?

struct stack_elem * peak(struct stack *);

「ピーク」、実装は「ピーク」を読み取ります。しかし、それがそのような警告を引き起こす可能性があるかどうかはわかりません。

于 2012-07-29T09:11:49.647 に答える
2

変化する:

struct stack_elem * peak(struct stack *);

に:

struct stack_elem * peek(struct stack *);

:)

于 2012-07-29T09:11:31.267 に答える