【问题标题】:How to refer to variable-length structures如何引用可变长度结构
【发布时间】:2013-03-18 22:15:22
【问题描述】:

以下代码拒绝在 SDCC 中编译,因为我使用了灵活的数组成员("This line"s)。

/** header of string list */
typedef struct {
    int nCount;
    int nMemUsed;
    int nMemAvail;
} STRLIST_HEADER;

/** string list entry data type */
typedef struct {
    int nLen;
    char str[];                    // This line
} STRLIST_ENTRY;

/** string list data type */
typedef struct {
    STRLIST_HEADER header;
    STRLIST_ENTRY entry[];         // This line
} STRLIST;

int main()
{
    return 0;
}

但是,我必须访问的数据已经以这种方式设置(我通过指针访问现有内存,而不是破坏堆栈),并且使用结构指针可以生成非常干净的代码。不幸的是,SDCC 不喜欢这样。有什么替代方法可以在我的代码中引用可以干净编译的内存结构?

【问题讨论】:

  • 根据标准,具有灵活数组成员的结构不能是结构的成员或数组的元素。所以STRLIST 无效。
  • @DanielFischer 我知道。重写此代码以使其符合标准的最佳方法是什么?
  • 好问题。您标记char str[]; 行让我怀疑SDCC 根本不喜欢灵活的数组成员?在这种情况下,我看到的唯一选择是为数组设置固定大小,或使用指针(并放弃局部性)。如果它接受灵活的数组成员,但不是递归的,你可以作弊并在STRLIST 中使用unsigned entry[];。不过,也不完全令人满意。

标签: c struct


【解决方案1】:

通常的方法是给数组成员一个大小:

typedef struct {
    int nLen;
    char str[1];
} STRLIST_ENTRY;

这让编译器很高兴。

编辑:您能否使用--std-c99--std-sdcc99 开关让SDCC 理解您的原始代码?

【讨论】:

  • 我明白了……一个问题。我希望sizeof(STRLIST_ENTRY) 返回没有变量成员的结构的大小。 (代码已经为允许这样做的不同编译器编写了!)是否有这样的版本(str[0] 也许?)可以做到这一点?还是应该直接用sizeof(...) - 1 修改代码?
  • @gh403:也许您可以说服 SDCC 理解您的原始代码 - 请参阅我编辑的答案。
  • 否 :(。我得到 warning 186: invalid use of structure with flexible array member 后跟 error 200: field 'entry' has incomplete type,都指第二个 // This line
  • @gh403:正如 Daniel Fischer 所指出的,你不能将这些东西放在一个数组中。
【解决方案2】:
typedef struct {
    int nLen;
    char *str;                    
} STRLIST_ENTRY;

我会这样做,并在准备好使用它时对数组进行 m​​alloc。您使用所有大写字母来定义结构名称是否有任何特殊原因?通常这些在大多数编码标准中都是小写的。

【讨论】:

  • 我不能malloc 数组。数据已经在内存中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2023-03-04
  • 2015-08-09
  • 2014-11-14
相关资源
最近更新 更多