空指针 - 从闪存加载结构
void pointer - Load structure from flash
我有一些示例代码,其结构存储在 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。为什么?这两种解决方案有什么区别?
我不熟悉 AVR 控制器中的闪存,但在 C 中我们通常使用 void*
来表示一块我们不知道它持有哪种类型的内存(与此相反,例如,intprt_t*
表示一块内存的地址,其内容应解释为 int
).
在第一个函数中,它被传递了一个void**
:你传递了一个void*
类型的变量所在的地址,然后通过*Address = Temp;
你填充内存中指向的区域通过Address
(因此在函数之外更新变量)。
在第二个函数中,你传递了一个 intptr_t
:这里同样的技巧不起作用,因为你分配给 local 内存地址的副本 StructAddr
一个新值,然后在函数终止后丢弃。
正如评论中的其他人所说,您需要在第二个函数的签名中添加 intptr_t*
并且您需要执行以下 *Address = Temp
.
我有一些示例代码,其结构存储在 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。为什么?这两种解决方案有什么区别?
我不熟悉 AVR 控制器中的闪存,但在 C 中我们通常使用 void*
来表示一块我们不知道它持有哪种类型的内存(与此相反,例如,intprt_t*
表示一块内存的地址,其内容应解释为 int
).
在第一个函数中,它被传递了一个void**
:你传递了一个void*
类型的变量所在的地址,然后通过*Address = Temp;
你填充内存中指向的区域通过Address
(因此在函数之外更新变量)。
在第二个函数中,你传递了一个 intptr_t
:这里同样的技巧不起作用,因为你分配给 local 内存地址的副本 StructAddr
一个新值,然后在函数终止后丢弃。
正如评论中的其他人所说,您需要在第二个函数的签名中添加 intptr_t*
并且您需要执行以下 *Address = Temp
.