问题是在 STRCPY 完成运行后变量 nodeType 正在更改。nodeType 不是与 STRCPY 调用中使用的任何其他变量相关的变量。虽然它在同一个结构中。nodeType 是一个 int 值为 3 的枚举。
下面如果以下信息可能最相关。我从枚举和结构中删除了大部分变量,因此它们不可见,我认为它们与问题无关。如果这有所作为,我正在 VS2010 中编码。这是创建 btree 的任务的一部分,但我的问题与 btree 无关。
enum NODETYPE
{
ROOTLEAF
};
typedef struct node
{
char key[MAX_CHILDREN_ROOT][MAX_KEY_LENGTH];
NODETYPE nodeType;
} nodeT;
... insertElement 函数的一部分
for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++)
{
strcpy(b->tempNode->key[b->tempNode->numberOfKeys - i], b->tempNode->key[b->tempNode->numberOfKeys - (i + 1)]);
}
..我调用的函数是插入一个元素。在此之前,我已经多次调用该函数,但这是下面这段代码第一次运行。在 STRCPY 运行后,nodeType 的值为 1280070990。我将变量设置为 watch,而它在 CXX0017 错误中,我认为这仅意味着它不在范围内。
我查找了数字 1280070990,它从各种引擎中产生了一堆与游戏相关的问题。我猜它是一个内存地址问题。
下面提供了解决方案。这是在数组边界之外写入的简单错误。我像这样分解了旧代码,然后遍历它。这使我能够确定我在键数组键之外编写的问题。
for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++)
{
int sourceI = b->tempNode->numberOfKeys - i - 2;
int destI = b->tempNode->numberOfKeys - i - 1;
char *Source = b->tempNode->key[sourceI];
char *Dest = b->tempNode->key[destI];
strcpy(Dest, Source);
}
全面了解两个变量所在的结构。
typedef struct node
{
node *childrenPTR[MAX_CHILDREN_ROOT];
int depth; //Distance from root to node
char key[MAX_CHILDREN_ROOT][MAX_KEY_LENGTH];
NODETYPE nodeType;
int numberOfChildren;
int numberOfKeys;
node *parentPTR;
} nodeT;
从结构体中变量的顺序我们可以看出nodeType跟随key。我相信 C 会以同样的顺序分配内存。所以我也可以看这里来确定问题。