C 节点指针在节点本身的定义中,它是如何工作的?

C 节点指针在节点本身的定义中,它是如何工作的?,c,data-structures,linked-list,C,Data Structures,Linked List,考虑这个struct定义: struct node { int age; struct node* next; }; 当结构节点{…}位于结构节点本身的定义中时,如何在结构节点{…}中设置结构节点*next sizeof(struct node*)的值是多少 与: struct node* to_add = (struct node*)(malloc(sizeof(struct node)); 添加的是否只有分配内存的地址 虽然我已经在C/C++中使用和实现了数据结构,但是我有

考虑这个
struct
定义:

struct node {
   int age;
   struct node* next;
};
  • 结构节点{…}
    位于
    结构节点
    本身的定义中时,如何在
    结构节点{…}
    中设置
    结构节点*next
  • sizeof(struct node*)
    的值是多少
  • 与:

    struct node* to_add = (struct node*)(malloc(sizeof(struct node));
    
  • 添加的
    是否只有分配内存的地址

    虽然我已经在C/C++中使用和实现了数据结构,但是我有一些基本的疑问。你能帮我理解我的疑惑吗。我试着在网上搜索,但是怀疑还是一样

    < > > P> <强>它是指针。指针定义是自然不透明的,也就是说,我们唯一需要知道的是指针可以是指向它的东西具有恒定大小(如所有C和C++非模板类型)。实际上,不透明指针是在C/C++中制作封装API的一种方法;它用于SDL之类的东西

  • 它通常应该与任何其他指针一样大。指针通常作为简单的内存地址实现,但内存本身可能是一个复杂的情况,具体取决于它运行的体系结构和软件。在x86-64上,我认为大小与一个字相同,即8字节

  • 取决于实现或体系结构。通常(指x86或x86-64),是的

  • 是。


  • 还有一件事;请注意,
    sizeof(Node)
    sizeof(age)+sizeof(next)
    由于编译器对齐,大小可能不同。编译器通常会尝试将内存设置为字大小的倍数或不同的大小(例如缓存大小),以使体系结构能够更好地访问内存,从而优化与字大小的对齐。

    以下是一个MS绘制的图形描述,描述了这样一个
    节点的外观:

    每个
    节点
    都有一个值(在本例中为42、69或613),并且每个节点都有一个指向下一个节点的指针,最后一个节点没有任何指针

    这不是一个无限递归结构-一个
    节点
    没有
    节点
    成员,它有一个
    节点*
    成员。指针就是一个指针,另一个内存地址
    sizeof(node*)
    与任何其他指针的大小相同(无论是4字节还是8字节)
    sizeof(node)
    更有趣,但取决于填充和其他对齐问题。在32位机器上,它可能是8字节。在64位机器上,它可能是16个字节(中间有4个字节的填充)

  • 因为您只需要一个类型声明来定义指向该类型的指针。
    struct
    定义的开头声明了该类型,因此可以在其中包含指向该类型的指针

  • sizeof(struct node*)
    返回指针的大小

  • malloc
    返回指向该类型大小的堆内存的指针,但内存未初始化

  • 大小正确,但尚未初始化


  • 声明足以创建指针。例如

    struct node;
    struct node* nodePtr = NULL;
    
    指针的大小不取决于对象的完整定义。因此,您可以使用:

    struct node;
    struct node* nodePtr = NULL;
    size_t s = sizeof(nodePtr);
    
    由于指针的创建不依赖于结构的完整定义,因此可以使用:

    struct node { // At this point struct node is a declared type.
    
       int age;
    
       // Since struct node is a declared type, you can create a pointer
       struct node* next;
    };
    

    读一读声明和定义之间的区别。你问了4个不同的问题,这使得这个问题太宽泛了。你能把范围缩小吗?@NathanOliver:你能回答问题1吗。事实上,我对所有这些问题都有疑问,否则我通常只问一个问题。为什么它不起作用?如果你不知道你的困惑在哪里,你就无法回答“这显然是可能的事情”的问题。@CuriousMind“我已经使用并实现了C/C++中的数据结构”请注意,没有C/C++这样的语言。它们是不同的编程语言,具有不同的机制和行为,但也有一些相同的关键字和行为。指针在32位系统上通常为4字节,在64位系统上通常为8字节。在x64上,将8字节的数量称为一个单词有点狡猾,我明白你的意思,但与x64的观点不符jargon@harold我使用的是更一般的定义,它可以被认为是适用于计算机体系结构的更“正确”的定义
    word
    是最初创建x86及其派生版本的传统16位字长。同样,他们可能保留了他们的行话,以便向后兼容。