c - 空指针 - 从闪存加载结构

标签 c pointers avr

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

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。为什么?这两种解决方案有什么区别?

最佳答案

我不熟悉 AVR Controller 中的闪存,但在 C 中我们通常使用 void* 来表示我们不知道它持有哪种类型的内存(相反例如,intprt_t* 表示一段内存的地址,其内容应解释为 int)。

在第一个函数中,它被传递了一个void**:你传递了一个类型为void*的变量所在的地址,然后通过*Address = Temp; 您填充内存中由 Address 指向的区域(因此在函数之外更新变量)。

在第二个函数中,您传递了一个intptr_t:由于您分配给了内存地址StructAddr<的本地副本,因此相同的技巧在这里不起作用 一个新值,然后在函数终止后丢弃。

正如评论中的其他人所说,您需要在第二个函数的签名中使用 intptr_t* 并且您需要执行以下操作 *Address = Temp

关于c - 空指针 - 从闪存加载结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55162440/

相关文章:

c - fscanf 导致段错误

c++ - 取消引用时如何将空指针转换为指针?

c - 如何将结构初始化为空?

通过引用传递给函数来更改数组的元素

c - 在 C 中使用 free 释放非字符指针

pointers - 如何将接口(interface)实现指针转换为接口(interface)指针?

c - 带有指针的段错误 : 11,

c++ - 字段 '__file::flags' 的指示符顺序与 'FILE' 中的声明顺序不匹配

c++ - void* (*)() 和 void* 有什么区别?

c++ - 为什么reinterpret_cast不是constexpr?