【问题标题】:Can I have a Structure as member of its own structure in C?我可以在 C 中将结构作为其自身结构的成员吗?
【发布时间】:2019-12-26 10:23:18
【问题描述】:

我可以在 C 中以它自己的结构(递归结构)创建一个结构的实例吗(尽管我现在当然会这样做,因为这有点奇怪和棘手)?

喜欢:

int main(void)
{
    struct type
    {
         char name[20];
         char address[35];

         struct type;
    };

    return 0;
}

当然,编译器给了我警告:

warning: declaration does not declare anything  

但他/它让它通过并给了我一个可执行程序。


因为我想用 C++ 编译器编译同一个程序,他/它抛出了一个错误:

 error: ‘main()::type::type’ has the same name as the class in which it is declared

所以问题是针对 C,而不是针对 C++。


  • 我可以这样做,而不会对我的程序造成任何更深层次的问题吗?
  • 我是否可能会使用这种技术进入未定义或未指定的行为?
  • 是否有任何理由不这样做(例如编译/性能问题)?

提前致谢。

【问题讨论】:

  • 假设您的尝试是可行的,您希望该结构的大小是多少?
  • 你试试自己计算type的大小如何?
  • @Yunnosch 我没想到尺寸这么重要。但目前,让我们假设提供的结构的大小。
  • 对于每层大约 55 个字节且层数不定且无限的结构,您会假设什么大小?
  • 如何访问最深层次的name 成员? (这是一个技巧题,你首先要确定最深的层次。可以吗?)

标签: c performance structure recursive-datastructures


【解决方案1】:

首先,struct type; 是前向声明,而不是成员变量定义。其次,不,你不能这样做,你需要使用指针。

要使用必须完全定义的结构,定义必须结束(以} 结尾)才能使用。否则编译器不知道结构的完整大小,也不知道它有多大以及必须如何为结构实例保留内存。

但是要创建指向结构的指针,编译器只需要知道结构标记(在您的情况下为type)。这是因为在编译时就知道指针的大小。此时不需要知道整个结构本身的大小。

【讨论】:

  • 我的想法是(现在似乎是错误的),编译器将struct type 在其自己的结构中的实例视为其“母亲”的复制,我不需要声明和定义第二次。
  • 好吧,你没有给该类型的字段一个标识符,甚至忽略了这样一个事实,即它试图构造一个无限大小的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2020-11-25
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多