我想创建一个可以在C(可变长度数组)中创建列表的程序,但是当我编译我的代码时,我说有一个"来自不兼容指针类型"错误
错误在以下几行:
list_item *last = l->first;
last = last->next;
last->next = item;
代码:
typedef struct{
struct list_item *next;
void *data;
} list_item;
typedef struct{
list_item *first;
unsigned int len;
} list;
list *new_list(){
list *l = (list *) malloc(sizeof(list));
l->first = NULL;
l->len = 0;
return l;
}
list_item *new_list_item(){
list_item *item = (list_item *) malloc(sizeof(list_item));
item->next = NULL;
item->data = NULL;
return item;
}
void add_to_list(list *l, void *data){
if(l == NULL || data == NULL){
return;
}
list_item *item = new_list_item();
item->data = data;
int i;
list_item *last = l->first;
for(i = 0; i < l->len; i++){
last = last->next;
}
last->next = item;
l->len++;
}
答案 0 :(得分:0)
首先在add_to_list中,您需要检查l-&gt; first是否为空(列表为空),因为稍后您尝试访问last-&gt; next但在这种情况下last为null。
此外,函数add_to_list仅接受void *作为数据,因此如果您想添加任何其他内容,您应该进行类型转换
例如:
add_to_list(l,(void *)4)如果是数字或
add_to_list(l,(void *)struct something);
答案 1 :(得分:-1)
您引用的错误是由此引起的:
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
<ul id="mylist" class="text-center">
<li><a class="btn btn-warning btn-outline btn-lg sharp" href="http://google.com" target="_blank"> <i class="fa fa-address-card fa-5x"></i>My text below icon</a>
</li>
<li><a class="btn btn-info btn-lg sharp" href="http://www.google.com" target="_blank"><i class="fa fa-address-book fa-5x"></i>My text below icon </a></li>
</ul>
这是创建一个匿名结构(不一个名为typedef struct {
struct list_item *next;
void *data;
} list_item;
),然后为该匿名结构提供typedef&#39; d name list_item
。如果你需要自我引用,你应该这样做:
list_item
您还有其他未提及的错误。例如,您尝试取消引用typedef struct list_item {
struct list_item *next;
void *data;
} list_item;
指针:
NULL
第一次向列表中添加内容时,list_item *last = l->first;
for(i = 0; i < l->len; i++){
last = last->next;
}
为l->first
,表示NULL
为NULL,last
为0,因此循环不会执行。然后你做:
l->len
取消引用last->next = item;
指针并使您的应用程序崩溃。
假设您解决了这个问题,那么您将在此循环中点击下一个问题:
NULL
完成此循环后,最后一次将是for(i = 0; i < l->len; i++){
last = last->next;
}
。并且NULL
将被执行并再次导致段错误。实际上你需要停一个短路,以便正确分配下一个指针。
如果替换:
last->next = item
使用:
int i;
list_item *last = l->first;
for(i = 0; i < l->len; i++){
last = last->next;
}
然后事情会好得多。