使用const数据的struct初始化数组

时间:2014-11-27 08:34:14

标签: c arrays struct initialization const

我的情况与stackoverflow.com/questions/16676973有点类似,但由于缺乏知识,我无法从中学到必要的教训......

我想要实现的是在编译时将常量图像数据加载到内存中(不知道每个图像的大小)并获取每个图像的标识符数组,以便我可以在代码中随时访问它们。 理想的方法是指向每个图像开头的指针数组,然而有一个问题是如何确定每个图像的确切大小。当我调用图像[i]时,sizeof(imagedatatype)会根据我的变化...(我猜 - 不。那么怎么样?)

我是如何尝试这样做的:

typedef struct _imagedatatype {
    uint8_t imageId;
    uint8_t dataofoneimage[]
} imagedatatype;
const imagedatatype images [] = {
    {1,{A, ,L,O,T, ,O,F, ,C,O,N,V,E,R,T,E,D, ,I,M,A,G,E, ,D,A,T,A, ,I,N, ,H,E,X}}, 
    {2,{A, ,L,O,T, ,O,F, ,C,O,N,V,E,R,T,E,D, ,I,M,A,G,E, ,D,A,T,A, ,I,N, ,H,E,X}}
//of course, data is fake here, just for illustration purposes, normally it is 0x00, 0x0c, etc
};

当然,它会抛出错误,例如“数组的初始化程序太多......”。

简而言之 - 我觉得我在那里有很多错误,主要是意识形态,但正如我所说我是C的新手,所以我试图快速学习所有这些复杂的东西..

请帮忙。

2 个答案:

答案 0 :(得分:2)

不幸的是N1570 6.7.2.1.18说:

  

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可以   有一个不完整的数组类型;这被称为灵活的阵列成员。在大多数情况下,   灵活的数组成员被忽略。特别是,结构的大小就像是   灵活的数组成员被省略,除了它可能有更多的尾随填充   遗漏意味着

这意味着您无法使用此方法,因为无法正确计算数组中单个元素的地址。

您可以通过将图像数据与结构分开来解决这个问题:

typedef struct _imagedatatype {
    uint8_t imageId;
    size_t size;
    uint8_t const * data;
} imagedatatype;
uint8_t const img1data [] = { ... };
uint8_t const img2data [] = { ... };
const imagedatatype images [] = {
     { 1, sizeof img1data, img1data },
     { 2, sizeof img2data, img2data },
}

如果您绝对想要使用结构定义图像数据,可以使用X-macros来解决此限制,但基础方法仍然是相同的。 X-macros可能会变得混乱,所以请注意。

答案 1 :(得分:0)

typedef struct _imagedatatype {
    uint8_t imageId;
    uint8_t dataofoneimage[];   // you missed the trailing ; here
} imagedatatype;
没有指定数组大小的

dataofoneimage成员是一个称为灵活数组成员的特殊C功能(有关语义,请参阅c99,6.7.2.1p16)。它只能在你的结构声明的结尾(你正确做了什么),但它不能在声明时初始化。

使用malloc分配此结构和分配或复制以填充其dataofoneimage成员。