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

时间:2016-02-19 18:06:44

标签: c data-structures linked-list

考虑这个struct定义:

struct node {
   int age;
   struct node* next;
};
  1. struct node *next本身定义在struct node {...}时,struct node如何才能sizeof(struct node*)
  2. struct node* to_add = (struct node*)(malloc(sizeof(struct node)); 的价值是什么?
  3. 使用:

    to_add
  4. svg.append("line").style('shape-rendering','crispEdges').attr("x1",W/2).attr("y1",0).attr("x2",W/2).attr("y2",H).attr("stroke","black") 只有分配内存的地址吗?

    虽然我已经在C / C ++中使用和实现了数据结构,但是我有一些基本的疑虑。能否请你帮我理解我的疑虑。我试图在线搜索,但疑惑仍然保持不变。

4 个答案:

答案 0 :(得分:3)

这是一个MS画图描述了这样的node会是什么样的:

enter image description here

每个node都有一个值(本例中为42,69或613),每个node都有一个指向下一个节点的指针,最后一个节点保存一个指向任何内容的指针。

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

答案 1 :(得分:3)

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

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

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

  4. 尺寸合适,但尚未初始化。

答案 2 :(得分:2)

声明足以创建指针。 E.g。

struct node;
struct node* nodePtr = NULL;

指针的大小不依赖于对象的完整定义。因此,您可以使用:

struct node;
struct node* nodePtr = NULL;
size_t s = sizeof(nodePtr);

由于指针的创建不依赖于struct的完整定义,因此可以使用:

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;
};

答案 3 :(得分:1)

  1. 它是一个指针。指针定义自然是不透明的 - 也就是说,我们需要知道的唯一能够拥有指针的东西就是它所指向的东西一个恒定的大小(根据所有C和C ++非模板化类型)。事实上,不透明指针是一种用C / C ++制作封装API的方法;它用于像SDL这样的东西。

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

  3. 取决于实施或架构。通常(意味着x86或x86-64),是的。

  4. 还有一件事;请注意,由于编译器对齐sizeof(Node)sizeof(age) + sizeof(next)的大小可能不同。编译器经常尝试使字大小或不同大小(例如高速缓存大小)的存储器倍数,以使存储器访问更好地用于优化与字大小对齐的架构。