C编程问题使用STRCPY后无关变量被覆盖

Myk*_*ykC 1 c enums pointers programming-languages strcpy

问题是变量 nodeType 在 STRCPY 完成运行后被更改。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;
Run Code Online (Sandbox Code Playgroud)

... 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)]);
}
Run Code Online (Sandbox Code Playgroud)

..我调用的函数是插入一个元素。在此之前我已多次调用该函数,但这是下面这段代码第一次运行。STRCPY 运行后,nodeType 的值为 1280070990。我将变量设置为要监视,而它出现 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);
    }
Run Code Online (Sandbox Code Playgroud)

完整查看两个变量所在的结构。

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;
Run Code Online (Sandbox Code Playgroud)

从结构体中变量的顺序我们可以看到,nodeType 跟在 key 后面。我相信 C 会以相同的顺序分配内存。所以我也可以看看这里来找出问题所在。

Cli*_*rce 5

您正在将一个太长的字符串复制到某个地方的 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);
}
Run Code Online (Sandbox Code Playgroud)

通过调试器遍历它,可能会比数组中的某个source位置(使用空终止符 - 你是空终止字符串对吗?)更长。MAX_KEY_LENGTH它甚至可能是一些疯狂的东西,甚至不在你的数组中。

将其分解为更小、更容易以谨慎的步骤进行调试的东西。