【发布时间】:2016-11-22 14:40:51
【问题描述】:
我想要完成的是有一个可以多次使用的结构声明,仅在 C 中更改其数组成员长度。
我知道这可以通过灵活的数组成员来完成,但这会在运行时分配内存。
我想知道是否可能声明一个结构,该结构包含一个数组,该数组的大小在声明时未知,但在编译时已知 因为它的定义,使得对结构的每个实例使用的内存进行静态分配成为可能。如果不可能,那很好,我学到了一些新东西。
我的解释有点麻烦,我知道,所以我可能会做一个伪代码示例来说明我的意思。
这不是它的工作方式,而是我想做的一个例子
//file1.h
struct my_struct {
uint8_t char_member;
uint8_t array_member[]; //unknown length declaration
}
void function(struct my_struct, uint8_t array_size);
//file1.c
//random function for illustration purposes
void function(struct my_struct structure, uint8_t array_size){
for(uint8_t i = 0; i < array_size; i++){
structure.array_member[i] = 0;
}
return;
}
//fubar.h
extern struct my_struct foo; //still unknown length, but needed for fubar.c to aknowledge its existence.
//fubar.c
#include "file1.h"
#include "fubar.h"
//first instance of my_struct
struct my_struct foo {
char_member = 1; //random member definition
array_member[64]; //definition/re-declaration of foo's array member. Here, I think, it's where it gets ugly
}
//second instance of my_struct
struct my_struct bar {
char_member = 23;
array_member[128]; //definition/re-declaration of bar's array member.
}
function(foo, 64);
function(bar, 128);
这里的重点是我可以将my_struct 作为函数的参数,而不必担心为我计划使用的每个数组大小声明不同的函数和结构类型。我可以使用void * 作为函数参数,但这会破坏类型检查,必须准确传递我想要的结构类型。我能想到的唯一方法是将带有指针的 struct 声明为成员,然后定义“链接”到 struct 实例中的指针的数组,这种方法会有点尴尬,但它会工作吗?
上下文:我在嵌入式系统中工作,我想避免动态分配。关于通过接口将结构暴露在源文件之外,虽然原则上非常好,但会消耗宝贵的堆栈空间(即我不能在其他函数之上调用许多函数)。
我正在努力的现实目标是创建一些缓冲区。作为一项练习,我试图以一种可以包装在库中然后用于不同项目的方式制作此类缓冲区。
语言是plain C,方言是c99,编译器是GCC,目标是arm cortex-m3。
【问题讨论】:
-
请使用标准术语。
uint8_t array_member[]是一个灵活的数组成员 (FAM)。 -
编辑以反映正确的术语,ty。