c - 使用 const 数据结构初始化数组

标签 c arrays struct initialization constants

我的情况有点类似于 stackoverflow.com/questions/16676973然而,由于缺乏知识,我无法从中吸取重要的教训......

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

我尝试执行此操作的方式如下所示:

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 新手,所以我试图快速学习所有这些复杂的东西。

请帮忙。

最佳答案

不幸的是,N1570 6.7.2.1.18 说:

As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member. In most situations, the flexible array member is ignored. In particular, the size of the structure is as if the flexible array member were omitted except that it may have more trailing padding than the omission would imply

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

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

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宏来绕过这个限制,但底层方法仍然是相同的。 X 宏可能会变得困惑,因此请注意。

关于c - 使用 const 数据结构初始化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27166222/

相关文章:

python - 通过 SWIG 将简单的 numpy 数组传递给 C

Java:将数组的数组转换为集合的集合,反之亦然

javascript - 展平 N 维 JavaScript 数组

c++ - 雕刻结构内存布局 "in stone"

python - Cython:如何将 C 函数分配给 Python/Cython 变量?

c - 具有唯一结构作为参数 C 的 pthread

c - 在 MPLab X IDE 上用 C 语言从 IO 引脚读取和写入

c - 如何使用C中的函数记录用户输入数字的频率

c - 插入时对链表进行排序

同一接口(interface)的多个版本的 C++ 设计(头文件中的枚举/结构)