这个问题可能过于宽泛,或者存在意见偏见,但我知道这个网站充满了经验丰富的程序员,我认为这可能会鼓励您进行良好的讨论。
我在C中实现了一个嵌入式应用程序,我使用链表,包含结构:
struct my
{
uint16_t x;
uint16_t y;
char *text;
struct my *next;
struct my *prev;
};
总的来说它运作良好,但是现在在项目中我正在转向MISRA-C编程指南。 MISRA排除使用任何动态数据结构,因为它可能会在内存有限的嵌入式系统中导致未指定的行为。
我首先想到的是一个经典的静态数组结构,具有固定的大小。此结构永远不会超过30个实例,并且我们仍然只使用不到5%的可用内存,因此即使不使用所有内存,也不会影响我们的程序性能。像这样:
extern struct my arr[30];
然而,在这种方法中存在某些困难,例如,有时我需要从列表中删除一个元素,然后它会留下一个空元素,迫使我用一个索引重写所有其他元素。
是否有任何干净,优雅的方式来实现类似于链表的功能而不使用它们?
答案 0 :(得分:5)
您可以在静态数组上使用链接列表。唯一的区别是,不是指向动态分配的内存块的指针,而是使用指向数组内部元素的指针。如果您愿意,可以只使用数组索引而不是指针。 当然,实施会有一些差异: - 添加或删除元素时,您不必(un)分配内存 - 相反,你必须自己管理免费插槽,使用其他结构,如队列甚至是另一个空元素列表
答案 1 :(得分:0)
您可以使用数组索引代替指针。然后,您可以构建链接列表并使用索引值访问下一个或上一个窗口小部件。
答案 2 :(得分:0)
您可以使用另一个bool
数组来标记使用的条目。
有许多现有的API提供了这样的功能:在编译时为最大数量的实体保留内存,并提供分配和释放它们的函数。有关示例,请参阅Contiki memb
API and implementation。
答案 3 :(得分:0)
有很多方法可以达到这个目的但是这里有一个:你可以创建一个struct widget
数组+一组布尔值来标记它们是否空闲。然后,您可以通过找到第一个struct widget
可用的函数替换您的malloc。这类似于各种内核中的slab分配器。
答案 4 :(得分:0)
最好使用静态数组方法,而不是指针,你需要访问元素的索引。
虽然你将面临一些常见的问题,如;
优点是;