c - 未指定长度的数组的问题

标签 c types initialization

我正在用 c 语言编写一个 IrDA 堆栈并实现信息访问服务组件,并且我需要一个类/键/值对的查找表。为了使其保持有序的格式,我尝试将其全部放入一个初始化程序中。下面的代码工作得很好,并将数据编译到 ROM 中的压缩链接表中。

#define IAS_PTYPE_STRING 0x00
#define IAS_PTYPE_BYTE   0x01

typedef struct {
    UBYTE* name;
    UBYTE  type;
    UBYTE* value;
} IAS_Attrib_t ;

typedef IAS_Attrib_t* IAS_Attrib_List_t[];

typedef struct {
    UBYTE* name;
    IAS_Attrib_List_t* attributes;
} IAS_Class_t;

static const IAS_Class_t IAS_Database[] = {
    {"IrDA:IrCOMM",
        &(IAS_Attrib_List_t){
            &(IAS_Attrib_t){"Parameters", IAS_PTYPE_STRING, "IrDA:TinyTP:LsapSel"},
            NULL,
        },
    },
};

但是我在获取数据时遇到问题。根据使用的类型,我应该能够做这样的事情:

UBYTE class = 1;
UBYTE attr = 1;
UBYTE* name = (*(IAS_Database[class].attributes))[attr]->name;

这是因为

  • IAS_Database[class].attributes 是类型 IAS_Attrib_List_t*
  • *(IAS_Database[class].attributes) 是类型 IAS_Attrib_List_tIAS_Attrib_t*[]
  • (*(IAS_Database[class].attributes))[attr] 类型应为 IAS_Attrib_t*
  • (*(IAS_Database[class].attributes))[attr]->name 类型应为 UBYTE*

但是,当我尝试查询表时,我从 mspgcc 得到无效使用具有未指定边界的数组。即使像 (IAS_Attrib_t*)((IAS_Database[class].attributes)+(sizeof(IAS_Attrib_t)*attr)) 这样的 hack 也会失败,直到我像 (IAS_Attrib_t*) 那样将数据库强制转换为 void ((void*)(IAS_Database[class].attributes)+(sizeof(IAS_Attrib_t)*attr)) 然而,这感觉很脏。我真的很想找出正确的语法来以正确的方式完成它。

最佳答案

没关系。 在我彻底的沮丧中,我似乎尝试了所有变体,除了我在这里提出的变体。 (*(IAS_Database[class].attributes))[attr] 确实可以正常工作,甚至在表示为 (*IAS_Database[class].attributes)[attr] 时也可以工作我相信编译器错误地假设第一个指针(指向 UBYTE**)实际上是一个列表,并试图将索引应用于指针类型(其中类型不完整)。

关于c - 未指定长度的数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4342832/

相关文章:

c - 使用 fgets 将字符串从文件流读取到字符数组中。 [C]

c - 插入排序调试帮助

java - Java的原始类型是什么?

python - 库未在 Python (pygame) 中初始化

java - 将文件读入数组 - Java

c++ - 给定一个填充 unsigned char** 的 C 函数,如何在没有中间拷贝的情况下用数据填充 std::vector

c - C 中的隐式函数声明实际上会生成目标代码吗?

c# - 有没有办法编写适用于多种类型的扩展方法?

c - 从文件中读取 %le

c - 初始化结构内的指针成员