c - 指向结构的指针,试图引用其数据成员 - C

标签 c pointers struct

我有这个代码:

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;

我建议您退后一步,尝试简化您正在做的事情——您已经为您的类型添加了一些不必要的复杂性。


  1. 首先,struct node 类型在结构定义的结束 } 之前完整,您不能声明一个不完整类型的实例;但是,您可以声明一个指向不完整类型的指针。其次,存储 struct node 实例的大小必须是无限的,因为该实例包含它自己的一个实例,它包含它自己的一个实例,它又包含一个它自己的实例,等等。
  2. 快速咆哮 - 通常,您不应该将指针隐藏在 typedef 后面。如果程序员必须意识到他们正在处理一个指针(例如,如果他们需要访问结构类型的成员),那么在指针对象的声明中明确这一点(查看 FILE 以 stdio.h 为例 - 即使您只处理指向 FILE指针,该指针也不是 FILE 的一部分 类型定义)。

关于c - 指向结构的指针,试图引用其数据成员 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38982378/

相关文章:

c - 如何鼓励 C 程序中的未定义行为/乱序执行?

c - 动态分配的多维数组

c - 为什么在结构初始化期间使用点运算符?

c++ - 如何解释此错误,堆摘要,未初始化的变量?

C 在函数内部重新分配

c - 动态分配的函数中的局部指针变量会发生什么?

c++ - 为什么 const 结构数组在按名称引用 const 结构时不放在 .rodata 中?

c - 如何拥有一个使用指针 ptr 来读取和打印有关书籍结构的内容的程序?

c - DBus Glib 发送信号 - 没有发出信号

c - 为什么我们在初始化一个指向整数的指针时,在整数变量前使用 "&"?