【问题标题】:Is it possible to define a size changing structure in c?是否可以在 c 中定义尺寸变化结构?
【发布时间】:2017-05-28 00:23:48
【问题描述】:

如果您要声明如下内容:

struct MyStruct
{
   int field1;
   int[] field2;
   int field3;
}

field 2 实际上是一个指向数组的指针,而不是数组本身。所以 MyStruct 保留了 3 个字节的大小。我想知道是否有办法做类似的事情,除了 field2 应该是数组本身而不是指针。

显然你可以只用一个数组来做到这一点,但我的最终目标是能够在上述结构中拥有不同类型的不同大小;这将需要填充(我不想要)。

这可能吗?

【问题讨论】:

  • 你没有显示这三种结构类型的定义,但只要你定义了它们,你就可以创建一个联合,编译器有义务遵循你说你想要的规则跟随。
  • “这样所有字段都按照声明的顺序连续出现在内存中”--struct 中可能有填充。 Is this an XY problem?
  • 我建议您在决定您真正需要的是您想象的那样之前,非常仔细地阅读@DavidBowling 链接到的问题。您所面临的根本问题以前可能从未遇到过或解决过,但肯定没有按照您建议的方式解决。
  • 如前所述,这有强烈的 XY 问题的味道。 为什么您认为您需要结构始终为其最小尺寸?您真正想做什么?可能有更好的方法来解决您的问题。
  • 这确实应该从一开始就成为您问题的一部分。基本上,这是一个网络和树莓派问题,与 gcc 几乎无关。更新您的问题以更好地反映您要解决的实际问题,然后我们可以更好地尝试解决该问题。

标签: c gcc struct


【解决方案1】:

联合将至少与联合中最大的项目一样大,而不是更小。如果您当前正在使用较小的项目之一,它不会缩小联合或它所属的外部结构的大小。但是,联合之前和之后的项目在联合使用的内存之前和之后仍然是安全的并且物理存在,即使它们当前使用的内存没有完全接触。 This question 展示了一个示例,详细说明了如何创建这样的联合。

为了响应更新,如果外部结构确实必须具有相同的大小而不管联合,那么您希望做的最好的事情就是拥有一个指向联合内容而不是联合本身的指针。尽管如此,工会仍然不是“最小”规模。否则,按照 dbush 的建议进行操作,并拥有三个外部结构,根本不使用联合。

【讨论】:

  • 看,问题是该结构不能添加任何信息,它必须始终是包含信息的最小大小
  • 不可能让联合始终是“最小大小”——这也不是特定于实现的事情。工会的设计目的是在每次写入时在它所代表的工会成员之间进行更改。如果此时您将其用作其他成员,则它现在代表该成员。如果它的大小是最小大小并且您存储了一个更大的成员,那么您将破坏之后的所有内容。你能详细说明为什么你认为它必须尽可能小吗?
  • @Makogan 然后你需要 3 个独立的外部结构,每个都有自己的内部结构。没有办法根据您碰巧使用的工会成员来动态增长或缩小。
  • 这让我很难过:C
猜你喜欢
  • 2013-05-31
  • 2011-09-05
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多