我有这个代码:
typedef struct node
{
char* data;
struct node next;
} node;
typedef struct linkedList
{
node head;
int size;
} linkedList;
typedef struct _MyLinkedList *MyLinkedListP
{
struct linkedList* listp;
};
MyLinkedListP createList()
{
linkedList *list = (linkedList*)malloc(sizeof(linkedList));
(*list).head = NULL;
(*list).size = 0;
MyLinkedListP listP = list;
return listP;
}
我正在尝试构建一个函数:
MyLinkedListP cloneList(MyLinkedListP l)
l
是一个指向 linkedList
的指针,我试图获取它的成员(大小和第一个节点),以完成该功能。但我只是不明白如何在这个版本下做。
我还想询问有关我构建结构 MyLinkedListP
的问题。我的目标是创建一个类型,该类型是指向 linkedList
的指针,我这样做的方式是好的做法吗?
最佳答案
首先,这是行不通的:
typedef struct node
{
char* data;
struct node next;
} node;
struct
类型不能包含作为其自身实例的成员1;这应该写成
typedef struct node
{
char* data;
struct node *next; // next is a *pointer* to struct node
} node;
其次,虽然下面的问题不像上面的问题,但这不是好的做法:
typedef struct _MyLinkedList *MyLinkedListP
带有前导下划线的标识符保留用于实现;您不应该创建任何带有前导下划线的类型或对象名称。只需使用
typedef struct MyLinkedList *MyLinkedListP
改为2。
三、丢投中
linkedList *list = (linkedList*)malloc(sizeof(linkedList));
这不是必需的(自 C89 起),它会使调用变得困惑,并且会造成维护方面的麻烦。这可以变得更简单,如下所示:
linkedList *list = malloc( sizeof *list );
四、注意可以写
(*list).head = NULL;
(*list).size = 0;
作为
list->head = NULL;
list->size = 0;
a->b
是 (*a).b
的简写,使内容更易于阅读。
最后,
MyLinkedListP listP = list;
试图将 struct linkedList *
类型的值赋给 struct MyLinkedList *
类型的对象,但它们不兼容。根据您共享的代码,看起来您打算做的事情更像是
struct MyLinkedList myList;
list.listp = list;
或
struct MyLinkedList myList = {list};
甚至
MyLinkedListP listP = malloc( sizeof *listP ); // leaky abstraction from hiding
// pointer behind typedef
listP->listp = list;
我建议您退后一步,尝试简化您正在做的事情——您已经为您的类型添加了一些不必要的复杂性。
- 首先,
struct node
类型在结构定义的结束}
之前完整,您不能声明一个不完整类型的实例;但是,您可以声明一个指向不完整类型的指针。其次,存储struct node
实例的大小必须是无限的,因为该实例包含它自己的一个实例,它包含它自己的一个实例,它又包含一个它自己的实例,等等。 - 快速咆哮 - 通常,您不应该将指针隐藏在 typedef 后面。如果程序员必须意识到他们正在处理一个指针(例如,如果他们需要访问结构类型的成员),那么在指针对象的声明中明确这一点(查看
FILE
以 stdio.h 为例 - 即使您只处理指向FILE
的指针,该指针也不是FILE 的一部分
类型定义)。
关于c - 指向结构的指针,试图引用其数据成员 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38982378/