错误:参数的类型不兼容

时间:2012-07-18 16:29:58

标签: c list gcc types arguments

我正在用C写一个清单。 以下是来源:

#include <stdio.h>
#include <stdlib.h>


struct list {
 int value;
 struct list *next;
};

typedef struct list ls;



void add (ls **head, ls **tail, int val)
{
 ls *new, *tmp1, *tmp2;

 if (NULL == *head)
 {
    new = (ls*)malloc(sizeof(ls));
    *head = new;
    *tail = new;
    new->value = val;
    new->next = NULL;

    return;
 }

 else
 {
    tmp1 = *head;
    tmp2 = tmp1->next;
    while (tmp2 != NULL)
    {
        tmp1 = tmp2;
        tmp2 = tmp1->next;
    }

    new = (ls*)malloc(sizeof(ls));
    new->value = val;
    new->next = NULL;
    *tail = new;

    return;
 }
}



void show (ls **head, ls **tail)
{
 int i;
 ls *tmp;

 while (tmp->next != NULL)
 {
    printf("%d: %d", i,  tmp->value);
    i++;
    tmp=tmp->next;
 }

 return;
}



int main (int argc, char *argv[])
{
 ls *head;
 ls *tail;
 int n, x;

 head = (ls*)NULL;
 tail = (ls*)NULL;

 printf("\n1. add\n2. show\n3. exit\n");
 scanf("%d", &x);
 switch (x)
 {
    case 1:
        scanf("%d", &n);
        add(*head, *tail, n);
        break;

    case 2:
        show(*head, *tail);
        break;

    case 3:
        return 0;

    default:
        break;
}

 return 0;
}

当我用gcc编译它时

gcc -o lab5.out -Wall -pedantic lab5.c

我得到了奇怪的错误:

lab5.c: In function ‘main’:
lab5.c:84:3: error: incompatible type for argument 1 of ‘add’
lab5.c:16:6: note: expected ‘struct ls **’ but argument is of type ‘ls’
lab5.c:84:3: error: incompatible type for argument 2 of ‘add’
lab5.c:16:6: note: expected ‘struct ls **’ but argument is of type ‘ls’
lab5.c:88:3: error: incompatible type for argument 1 of ‘show’
lab5.c:52:6: note: expected ‘struct ls **’ but argument is of type ‘ls’
lab5.c:88:3: error: incompatible type for argument 2 of ‘show’
lab5.c:52:6: note: expected ‘struct ls **’ but argument is of type ‘ls’

对我来说一切都还可以......

参数类型为ls**而不是编译器所说的ls

有人看到可能出错的地方?

PS。我知道没有必要将*tail作为参数而没有使用它,但它会是,因为我想开发这个'程序'......

2 个答案:

答案 0 :(得分:4)

正如丹尼尔在评论中所说,并且在他的回答中说,使用&代替*会给你你想要的东西。这里有一点解释,帮助你记住。

* de - 引用它所附加的内容,这意味着它将变量视为指针并在该地址给出值。

&传递引用,这意味着它提供了存储值的地址,或者更确切地说,将指针传递给变量。

由于您希望将指针传递给变量head和tail,因此您希望将它们作为&head&tail传递,这会为您提供值**head和{{1}在另一端。在你习惯它之前,这似乎是违反直觉的。

答案 1 :(得分:1)

add(*head, *tail, n);

应该是:

add(&head, &tail, n);

因为你需要将head和tail指针的地址传递给函数。

需要对show函数的调用进行类似的修复。