无效指针-从Flash加载结构

时间:2019-03-14 12:22:02

标签: c pointers avr

我有一些示例代码,其结构存储在AVR微控制器的闪存中。

const MyStruct PROGMEM Struct =
{
   .MemberA = 1,
   .MemberB = 2,
}

此结构的地址已加载此函数:

const void* StructAddr;
Load(&StructAddr);

void Load(const void** Address)
{
   const void* Temp = NULL;
   Temp = &Struct;
   *Address = Temp;
}

在这种情况下使用空指针的原因是什么? 如果我这样尝试

const intptr_t StructAddr;
Load(&StructAddr);
void Load(const intptr_t Address)
{
   const void* Temp = NULL;
   Address = &Struct;
}

StructAddr的内容为0x00。为什么?这两种解决方案有什么区别?

1 个答案:

答案 0 :(得分:2)

我不熟悉AVR控制器中的闪存,但是在C语言中,我们通常使用void*来指示一块我们不知道它属于哪种类型的存储器(例如,与之相反) ,intprt_t*代表一块内存的地址,其内容应解释为int)。

在第一个函数中,传递给void**:传递地址void*类型的变量所在的地址,然后执行*Address = Temp;,填充{指向的内存区域。 {1}}(因此,该函数之外的变量将被更新)。

在第二个函数中,您传递了一个Address:在这里,由于您将内存地址intptr_t的一个 local 副本分配了一个新值,因此该技巧无效。 ,然后在函数终止后将其丢弃。

正如评论中的其他评论所述,您需要在第二个函数的签名中使用StructAddr,并且需要执行后续操作intptr_t*