【发布时间】:2021-10-08 01:49:58
【问题描述】:
我正在尝试为 EFM8 微控制器项目创建结构链接列表。我想让编译器在编译时为所有节点分配内存。我遇到的问题是没有为结构指针分配内存。
#define FOO_QUEUE_LEN 32
struct Foo {
uint8_t bar0;
struct Foo *next;
};
struct Foo queue[FOO_QUEUE_LEN];
void main (void)
{
while(1) { ;; }
}
我希望这段代码为每个 Foo 结构分配 4 个字节(bar0 为 1 个字节,next 为 3 个字节,因为在此架构中,如果您不指定内存位置,则为 24 位地址是必需的。
但在调试时,该结构只报告每个结构的 1 个字节,并且扩展任何数组成员都会显示 Error: cannot dereference this type 消息。
更奇怪的是,如果你在主循环中对结构体数组进行操作,结构体在内存中的大小计算正确:queue[1].bar0 = 0xCC; 会将值写入内存地址 0x4。问题是编译没有分配足够的内存,所以我们超出了每个结构的边界(在这种情况下,0xCC 最终位于queue[4].bar0)。
是否需要一些指令在编译时正确调整这些结构指针的大小?
【问题讨论】:
-
我希望它是调试器的工件。如果只打印 sizeof 值会发生什么?
-
谢谢@SergeyA,你为我解决了这个问题。在主循环中,添加一个变量来存储 sizeof(queue) 和一个 dummy 来存储 0xCCCC,我可以看到结构数组在哪里结束并且它被正确分配。非常感谢!
标签: c struct linked-list keil c51