【问题标题】:Why can't a struct be a member of itself?为什么结构不能成为其自身的成员?
【发布时间】:2014-04-05 13:37:47
【问题描述】:

我有一个结构 foo。声明foo* 类型的成员有效:

typedef struct foo
{
    struct foo* children[26];
} foo;

但如果我尝试声明foo 类型的成员,我会收到错误:

typedef struct foo
{
    struct foo children[26];
} foo;

这个声明给了我错误

'struct foo'的定义直到结束'}'才完成

【问题讨论】:

  • 每个帖子必须只有一个问题。我已经删除了第二个问题,但您可以单独发帖。
  • 不要使用is_initializes,使用空指针。另外,最好将子指针放在开头。

标签: c struct


【解决方案1】:

结构T 不能包含自身。你怎么知道它的大小?这样做是不可能的,因为T 的大小需要您知道T 的大小(因为T 包含另一个T)。这变成了无限递归。

您可以在结构 T 中拥有指向 T 的指针,因为指针的大小与指向的对象的大小不同:在这种情况下,您只需将内存地址存储在另一个T 已存储 - 您需要做的所有空间基本上就是您需要存储另一个 T 所在的内存地址所需的空间。

【讨论】:

  • 你的意思是,因为所有指向 struct 的指针对于任何实现都是相同的大小。
  • @Deduplicator 是的。所有指向struct T 的指针大小相同。
【解决方案2】:

结构 Trie 不能在其中包含另一个结构 Trie,它将进行永无止境的递归,但它可能包含指向另一个结构 Trie

所以第一个是正确的

typedef struct TRIE
{
    bool is_endpoint;
    bool is_initialized;
    struct TRIE* children[26];
} TRIE;

【讨论】:

    【解决方案3】:
    1. T 类型的对象不能包含另一个相同类型的非静态对象。如果可能的话,如何找到该对象的大小?在当前系统中,指向对象的指针大小始终保持不变。
    2. 检查currentptr 的值是否为非NULL,然后才能访问currentptr 的字段(如is_endpoint)。

    【讨论】:

      猜你喜欢
      • 2013-05-20
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多