我遇到了一个奇怪的问题:有一些代码我已经工作了几个月,没有出现任何问题(好吧,不是这个问题)。但突然间,将值分配给位于特定文件中的 typedef 结构中的任何结构成员会导致硬故障(不可恢复)。当我的 IDE 中的故障掩码寄存器到达硬故障处理程序时,其值为“0”。该 typedef 在头文件中声明,并在源文件中声明它的实例。
这是一个很大的结构,所以考虑到可能是一些失控的内存问题创建了堆栈/堆问题,我在同一个头文件中创建了另一个只有一个成员(uint8_t,又名字节)的结构。同样的问题:尝试为 uint8_t 分配一个值(例如 32)会导致处理器故障。
我在整个代码中以完全相同的方式声明了 typedef 结构,其中许多结构在有问题的结构之前被访问,没有任何问题。该问题仅发生在这一个源文件/标头组合中。
我正在努力思考会导致这种情况的原因或下一步该去哪里寻找。大家有什么想法吗?
Globals.h
typedef struct TestGlobWord_
{
uint8_t GlobWord;
} TestGlobWord;
MyFile.c
TestGlobWord* GbobalWord = NULL;
void MyFunc(void)
{
GbobalWord->GlobWord = 32;
}
我不确定您真正打算做什么,特别是因为您说您已经编写了相当多的代码,并且这些问题通常很早就会出现。
诸如
TestGlobWord* GlobalWord = NULL;
(注意 *
!)之类的声明声明了一个指向 TestGlobWord
类型实例的 指针,但不为其分配任何内容 (
= NULL
)。因此使用该指针将引发错误。要初始化指向某些内容的指针,您可以尝试:
void MyFunc(void)
{
GlobalWord = new TestGlobWord();
GlobalWord->GlobWord = 32;
}
或者,要直接创建全局实例,请将代码更改为:
TestGlobWord GbobalWord; // NO star
void MyFunc(void)
{
GbobalWord.GlobWord = 32; // Note that you now need to use the dot here to access the field
}