c-双链接列表2



我已经做了很多链表,但我有一段时间没有使用它们,也没有真正编程任何东西,所以我迷失了方向。以下是我的代码:

#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_PersonA处存在,因此它可以在该结构中使用。

相关内容

  • 没有找到相关文章

最新更新