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

时间:2010-11-23 18:44:53

标签: c pointers programming-languages enums strcpy

问题是在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;

我们可以从struct中的变量顺序看到nodeType跟随key。我相信C会以同样的顺序分配内存。所以我也可以在这里查看问题。

2 个答案:

答案 0 :(得分: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可能比你的数组中的某个地方(使用null终结符 - 你的字符串是否正确终止你的字符串?)MAX_KEY_LENGTH更长。甚至在你的阵列中它甚至可能是疯狂的东西。

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

答案 1 :(得分:1)

如果你使用一个str *函数,它需要一个空终止的字符串,而不是一个空终止的字符串。或者,如果您要复制的内容对于您正在复制的内容而言不够大。