gpt4 book ai didi

c - Keil C51 在编译时不为结构指针分配内存

转载 作者:行者123 更新时间:2023-12-04 07:18:51 29 4
gpt4 key购买 nike

我正在尝试为 EFM8 微 Controller 项目创建一个结构链表。我想让编译器在编译时为所有节点分配内存。我遇到的问题是没有为结构指针分配内存。

#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 个字节struct ( bar0 为 1 个字节, next 为 3 个字节,因为在此体系结构中,如果您不指定内存位置,则需要 24 位地址。
但是在调试时,该结构只为每个结构报告 1 个字节,并且扩展任何数组成员都会显示 Error: cannot dereference this type信息。
enter image description here
更奇怪的是,如果在主循环中对struct数组进行操作,则正确计算出内存中struct的大小: queue[1].bar0 = 0xCC;将值写入内存地址 0x4。问题是编译没有分配足够的内存,所以我们忽略了每个结构的边界(在这种情况下, 0xCC 结束于 queue[4].bar0 )。
在编译时是否需要一些指令来正确调整这些结构指针的大小?

最佳答案

comment from SergeyA是正确答案:

I would expect it to be the artifact of the debugger. What happens if you just print the sizeof value?


考虑这个程序的扩展版本:
#define FOO_QUEUE_LEN   32

struct Foo {
uint8_t bar0;
struct Foo* next;
};

struct Foo xdata queue[FOO_QUEUE_LEN];




void zeroFooStruct(struct Foo *fooPacket) {
// Using FF for debugging so I can see memory writes
fooPacket->bar0 = 0xFF;
fooPacket->next = 0;
}

void initializeFooQueue(void)
{
uint8_t i;
struct foo *previous;

previous = NULL;

// This linked list is a FILO
for (i=0; i<FOO_QUEUE_LEN; i++)
{
zeroFooStruct(&queue[i]);
queue[i].next = previous;
previous = &queue[i];
}
}

void main (void)
{
uint16_t s;
uint16_t mydata = 0xCCCC;
initializeFooQueue();

s = sizeof(queue);

while(1) { ;; }
}
我们可以看到,对于每个节点,我们存储了 bar0 的 0xFF 和前一个节点的地址。 4 个字节乘以 32 个节点 = 0x80 个内存插槽。然后该内存空间具有我们预期的 sizeof值(0x0080)后跟我们的虚拟值(0xCCCC),表明确实分配了正确的内存量,并且调试器没有正确显示内存。
enter image description here

关于c - Keil C51 在编译时不为结构指针分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68626155/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com