我已经做了很多链表,但我有一段时间没有使用它们,也没有真正编程任何东西,所以我迷失了方向。以下是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int age;
int pers_num;
char name[100];
void *previous;
void *next;
}Person;
int main(){
Person first_element;
Person last_element;
first_element.next = (Person *)(&last_element);
last_element.age = 19;
printf("%dn",(&last_element)->age);
printf("%dn",(first_element.next)->age);
}
你能向我解释一下为什么会出现以下错误吗?
speicher.c: In function 'main':
speicher.c:22:39: warning: dereferencing 'void *' pointer
23 | printf("%dn",(first_element.next)->age);
| ^~
speicher.c:23:39: error: request for member 'age' in something not a structure or union
据我所知;first_element.next";应该是指向last_element的指针。因此,您应该能够使用->访问last_element中的数据。即使认为第22行应该具有与第23行相同的输出,但第22行运行得非常完美,在第23行中抛出了错误。
您不能取消引用void指针,因为它是引用void类型的指针:-(换句话说,它并不真正知道它指向的实际类型。这两行行为不同的原因是,请记住a->b
只是(*a).b
:的语法糖
printf("%dn",(&last)->age);
// This (&last)->age, which is actually the same
// as last.age. In both cases, the type being used
// to get the age field is Person, so no problem.
printf("%dn",(first.next)->age);
// This (first.next)->age is the same as
// (*(first.next)).age. Because first.next is of type
// void *, it cannot be dereferenced.
您所做的类似于用无效的void x
声明变量(不要将其与有效的void *x
混淆(。
你最好(在结构中(指向你想要的实际类型,比如:
typedef struct s_Person { // A
int age;
int pers_num;
char name[100];
struct s_Person *previous, *next;
} Person; // B
请注意,在创建Person
类型定义时,不能使用它,因为它还不存在。简单地说,你可以认为它是在B
点产生的。命名结构s_Person
在A
处存在,因此它可以在该结构中使用。