0

问题是在 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 会以同样的顺序分配内存。所以我也可以看这里来确定问题。

4

2 回答 2

4

您正在将一个太长的字符串复制到某处的 key[] 中。它溢出到 nodeType 中。

因为我猜你是新来的,所以我会重新编码以便更容易阅读,以便你了解正在发生的事情。也许是这样的:

for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++)
{
  char *dest = b->tempNode->key[b->tempNode->numberOfKeys - i];
  char *source = b->tempNode->key[b->tempNode->numberOfKeys - (i + 1)];
  strcpy(dest, source);
}

通过调试器进行处理,source可能会比MAX_KEY_LENGTH数组中某处的时间长(使用空终止符——你是空终止你的字符串吗?)。即使在您的阵列中,它甚至可能是疯狂的。

将其分解为更小且更易于以谨慎的步骤进行调试的内容。

于 2010-11-23T18:48:06.547 回答
1

如果您在不是以空结尾的字符串上使用 str* 函数(该函数需要以空结尾的字符串),这正是发生的情况。或者,如果您要复制的内容对于您要复制的内容来说不够大。

于 2010-11-23T18:48:26.787 回答