我对这个小程序有疑问。它为列表添加了一些值。如果我取消注释//printf("%d",first->val);
,程序会出错。一切似乎都没问题;(
#include <stdio.h>
#include <stdlib.h>
typedef struct element {
struct element *next;
int val;
} el_listy;
el_listy *first = 0;
void add_to_list(el_listy *lista, int value)
{
if(lista == 0)
{
lista = malloc (sizeof(el_listy));
lista->val = value;
lista->next = 0;
printf("added as first \n");
}
else
{ printf("added as fsecond \n");
el_listy *wsk = lista,*tmp;
while(wsk->next != 0) wsk = wsk->next;
tmp = malloc (sizeof(el_listy));
tmp->val = value;
tmp->next = 0;
wsk->next = tmp;
}
}
int main ()
{
add_to_list(first,2);
add_to_list(first,4);
//printf("%d",*first->val);
system("pause");
return 0;
}
答案 0 :(得分:4)
first->val
就像(*first).val
一样,你不能同时使用它们。另外,正如missno所说,add_to_list
永远不会改变first
你应该将它的地址作为参数传递,而不是指针本身,这意味着add_to_list(&first,4);
(并改变add_to_list
的实现)
答案 1 :(得分:2)
您的计划永远不会更改first
的值。它仍然是一个空指针,因此在解除引用时会出错。
答案 2 :(得分:1)
->
已经跟随指针,因此*
会尝试将first
视为指向el_listy
的指针。您可能会发现cdecl
有帮助。
答案 3 :(得分:1)
您应该使用(*first).val
或first->val
。否则你会得到错误的间接等级。
答案 4 :(得分:0)
是的,这是一个简单的错误。
调用* add_to_list()*函数后,fitsr 不会改变。
你应该定义这样的函数:
add_to_list(El_list **lista, ...)